抽象方法与继承

时间:2013-11-28 23:07:50

标签: java oop

我正在努力学习更多有关课堂设计的知识,并且遇到了两难境地。假设我有三个抽象的在线拍卖:销售,卖家和买家。销售已经卖方和买方。卖方和买方都有类似的字段集,例如姓名,电话号码和地址,将它们分组到单个类中是有意义的,比如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类型,因此它们不适合我们的类层次结构。如果我们使用了接口,可以防止这种情况,但我们需要复制不同的联系人字段。

出现这种情况最好的方法是什么?

3 个答案:

答案 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或您辖区内可能适合的任何名称派生。然后,您可以从那里派生PersonBusiness