我正在努力学习更多有关课堂设计的知识,并且遇到了两难境地。假设我有三个抽象的在线拍卖:销售,卖家和买家。销售已经卖方和买方。卖方和买方都有类似的字段集,例如姓名,电话号码和地址,将它们分组到单个类中是有意义的,比如Person。然后,我们可以集中代码,为Abstract Person类中的字段和访问器集中,并为教师和学生提供特定类型。
这可能导致代码如:
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
}
现在,应用程序需要包含企业对企业客户,但由于卖方和买方属于Person类型,因此它们不适合我们的类层次结构。如果我们使用了接口,可以防止这种情况,但我们需要复制不同的联系人字段。
出现这种情况最好的方法是什么?
答案 0 :(得分: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 :(得分: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
}
因此,您可以通过买方和卖方类别共享与身份联系信息相关的行为,同时使您的类型层次结构保持真正重要的业务相关功能
答案 2 :(得分:0)
将人员重命名为NaturalPerson
,并从BusinessObject
或您辖区内可能适合的任何名称派生。然后,您可以从那里派生Person
和Business
。