Java 抽象方法与继承

Java 抽象方法与继承,java,oop,Java,Oop,我试图学习更多关于课堂设计的知识,但我遇到了一个两难的境地。假设我有一个网上拍卖,有三个抽象概念:销售、卖家和买家。Person说,销售有卖方和买方。卖方和买方都有类似的字段集,如姓名、电话号码和地址,将它们归为一个类是有意义的。然后,我们可以集中代码,用于抽象人员类中的字段和访问器,并为教师和学生指定特定类型 这可能导致以下代码: class Sale { Person teacher; Person student; String description;

我试图学习更多关于课堂设计的知识,但我遇到了一个两难的境地。假设我有一个网上拍卖,有三个抽象概念:销售、卖家和买家。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类型的,所以它们不适合我们的类层次结构。如果我们使用接口,这是可以避免的,但我们需要复制不同的联系人字段


摆脱这种情况的最佳方法是什么?

将Person重命名为
NaturalPerson
,并从
BusinessObject
或任何适合您管辖范围的名称派生出来。然后,您可以从那里派生出
Person
Business

将Person重命名为
NaturalPerson
,并从
BusinessObject
或任何适合您管辖范围的名称派生。然后,您可以从中派生出
Person
Business

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

比如说

//  both buyer and seller
class BusinessEntity {
  // an interface that can be a person, or a business
  private Agent agent;
然后这个人班

abstract class Person implements Agent {

}
商务舱呢

abstract class Business implements Agent {

}

并考虑将事情设置为便于使用依赖注入来更改业务实体持有的代理< /p> 考虑通过构造函数而不是继承来扩展。在此过程中,您可以同时使用抽象类和接口,其中卖家和买家都包含由接口定义的某种代理,并且让您的person抽象类实现接口,也让抽象业务客户端实现接口

比如说

//  both buyer and seller
class BusinessEntity {
  // an interface that can be a person, or a business
  private Agent agent;
然后这个人班

abstract class Person implements Agent {

}
商务舱呢

abstract class Business implements Agent {

}

并考虑将事情设置为便于使用依赖注入来更改业务实体持有的代理< /p> 考虑使用对您的业务不适当部分的联系人字段,而不是共享工具的组合继承。例如:

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
}

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

考虑对您的联系人字段使用组合而不是继承,这些字段不是您业务的一部分,而是一个共享工具。例如:

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
}

因此,您可以通过买方和卖方类共享与身份联系信息相关的行为,同时将类型层次结构保留为真正重要的业务相关功能

考虑通过组合而不是继承进行扩展。在这样做的过程中,您可以使用抽象类和接口,其中卖方和买方包含由接口定义的某种代理,而让你的抽象类实现界面也有抽象的业务客户端实现接口。@ HovercraftFullOfEels能提供一个例子吗?一个重要的问题是,一个人是否既是卖方又是买方?考虑通过扩展而不是继承来扩展。在这样做的过程中,您可以使用抽象类和接口,其中卖方和买方包含由接口定义的某种代理,让您的person抽象类实现接口,也让抽象业务客户机实现接口。@HoverCraftfullOfels您能提供一个例子吗?需要问的一个重要问题是,一个人可以既是卖家又是买家吗?