2013-11-28 149 views
0

我想了解更多关于类设计的知识,并遇到了一个困境。假设我有三个抽象的在线拍卖:出售,卖方和买方。 A卖方卖方和买方。卖方和买方有类似的字段集合,例如姓名,电话号码和地址,并且将它们分组为单个类别是有意义的,例如Person。然后,我们可以集中代码,为抽象人类中的字段和访问者集中代码,并为教师和学生提供特定的类型。抽象方法vs继承

这可能会导致代码,如:

class Sale { 
    Person teacher; 
    Person student; 

    String description; 
    int hourlyRate; 

    // Some lesson methods 
} 

abstract class Person { 
    private String name; 
    private String address; 
    private String telephoneNumber; 
    // Getters & setters... 
} 

class Seller extends Person { 
    // Some teacher stuff 
} 

class Buyer extends Person { 
    // Some student stuff 
} 

现在,应用需求纳入企业对企业客户,但由于卖方和买方的类型的人,他们没有融入我们的类层次结构。如果我们使用一个接口,这可能会被阻止,但我们需要复制不同的联系人字段。

这种情况最好的办法是什么?

+1

通过组合而不是继承考虑扩展。在此过程中,您可以同时使用抽象类和接口,其中卖方和买方包含由接口定义的某种代理,并且您的人抽象类实现接口,并且抽象业务客户端实现接口。 –

+0

@HovercraftFullOfEels你能提供一个例子吗? – kiruwka

+0

要问的一个重要问题是,一个人可以是**卖方还是买方? –

回答

0

将人员重命名为NaturalPerson,并从BusinessObject或其他任何可能符合您所在地区的名称推导出来。然后你可以从那里得到PersonBusiness

3

考虑通过组合扩展而不是继承。在此过程中,您可以同时使用抽象类和接口,其中卖方和买方包含由接口定义的某种代理,并且您的人抽象类实现接口,并且抽象业务客户端实现接口。

例如

// both buyer and seller 
class BusinessEntity { 
    // an interface that can be a person, or a business 
    private Agent agent; 

然后Person类...

abstract class Person implements Agent { 

} 

和公务舱

abstract class Business implements Agent { 

} 

,并考虑设置的东西,以便它会很容易使用依赖注入来更改您的BusinessEntity所持有的代理

1

考虑使用合成而不是继承来处理您的联系人字段,这些字段不适合作为业务的一部分,而是一种共享工具。例如:

class Identity { 
    private String name; 
    private String address; 
    private String telephoneNumber; 
    // Getters & setters... 

    // behaviours 
} 

class Seller { 
    private Identity identity; 
    // Getters & Setters 

    // behaviours 
} 

class Buyer { 
    private Identity identity; 
    // Getters & Setters 

    // behaviours 
} 

因此,你可以通过买方和卖方类共享联系人身份信息相关的行为,同时保持你的类型,层次结构,以真正显著业务相关的功能