如何在Java中实现重叠继承?

如何在Java中实现重叠继承?,java,Java,我想知道如何将重叠类型的继承转换为Java。我得到了抽象类Person和两个扩展子类Driver和Passenger。正如你们所知,司机也可能是乘客。所以问题是:在Java中实现重叠的最佳方法是什么?我听说最好的方法是使用组合,但我不知道如何使用。当一个类可以在一个系统中扮演两个角色时,Java中基于继承的方法是定义两个接口,并让类实现它们: interface Passenger { ... // Methods applicable to passengers } interface

我想知道如何将重叠类型的继承转换为Java。我得到了抽象类Person和两个扩展子类Driver和Passenger。正如你们所知,司机也可能是乘客。所以问题是:在Java中实现重叠的最佳方法是什么?我听说最好的方法是使用组合,但我不知道如何使用。

当一个类可以在一个系统中扮演两个角色时,Java中基于继承的方法是定义两个接口,并让类实现它们:

interface Passenger {
    ... // Methods applicable to passengers
}
interface Driver {
    ... // Methods applicable to drivers
}
class Person implements Driver, Passenger {
    ... // A person can be a driver or a passenger
}
class Pet implements Passenger {
    ... // A pet can be only a passenger
}
您可以在内部使用composition来实现接口,方法是将方法调用转发给Person中的private helper passenger和driver对象


在Java-8中,您可以将所有实现类通用的逻辑放入默认方法实现中。

当一个类可以在系统中扮演两个角色时,Java中基于继承的方法是定义两个接口,并让该类实现它们:

interface Passenger {
    ... // Methods applicable to passengers
}
interface Driver {
    ... // Methods applicable to drivers
}
class Person implements Driver, Passenger {
    ... // A person can be a driver or a passenger
}
class Pet implements Passenger {
    ... // A pet can be only a passenger
}
您可以在内部使用composition来实现接口,方法是将方法调用转发给Person中的private helper passenger和driver对象


在Java-8中,您可以将所有实现类通用的逻辑放入默认方法实现中。

类似于dasblinkenlight的回答,但我认为技术上更正确:

interface Person{}
interface Pet{}
interface HumanPassenger extends Person{}
interface PetPassenger extends Pet{}
interface Driver extends HumanPassenger{}
在这种情况下,驱动程序通过HumanPassenger的祖先扩展HumanPassenger和Person。您也可以通过以下方式明确执行此操作:

interface Driver extends HumanPassenger, Person{}
我说这在技术上更正确的原因是通过is-后代类应该具有的关系。例如,一个人是一个人,一个人不是一个人,一个人可以是一个人可以是的任何东西,不只是dasblinkenlight回答中的一个人,一个人是一个乘客,但是如果一个人是一个行人呢

编辑: 人类乘客、宠物乘客和司机,都可以是班级,我只是保持简单。驱动程序类示例:

class Driver extends HumanPassenger implements Person{}
或者如果HumanPassenger仍然是一个界面:

class Driver implements HumanPassenger{}


所有这些都将实现相同的功能,尽管当然只有类能够实例化。

类似于dasblinkenlight的答案,但我认为从技术上来说更为正确:

interface Person{}
interface Pet{}
interface HumanPassenger extends Person{}
interface PetPassenger extends Pet{}
interface Driver extends HumanPassenger{}
在这种情况下,驱动程序通过HumanPassenger的祖先扩展HumanPassenger和Person。您也可以通过以下方式明确执行此操作:

interface Driver extends HumanPassenger, Person{}
我说这在技术上更正确的原因是通过is-后代类应该具有的关系。例如,一个人是一个人,一个人不是一个人,一个人可以是一个人可以是的任何东西,不只是dasblinkenlight回答中的一个人,一个人是一个乘客,但是如果一个人是一个行人呢

编辑: 人类乘客、宠物乘客和司机,都可以是班级,我只是保持简单。驱动程序类示例:

class Driver extends HumanPassenger implements Person{}
或者如果HumanPassenger仍然是一个界面:

class Driver implements HumanPassenger{}


所有这些都将实现相同的功能,当然只有类能够实例化。

这是dasblinkenlight提供的答案的扩展

该解决方案基于Tony Hawk开发团队的团队负责人在20世纪90年代描述的组件模式,通常用于游戏开发

免责声明:我将在没有Java编译器的情况下编写代码,因此请告诉我是否存在语法错误

你的抽象类人物 这样我们就暴露了司机的行为 这里我们导出乘客的行为 在这里,我们给出了驱动程序的实际逻辑 这里我们把乘客的逻辑放在这里 最后是驱动程序类 乘客舱呢 收尾 我真的希望没有语法错误

这种方法的强大之处在于,我们不会复制驾驶员或乘客的逻辑,因为我们只在相关组件中编写一次代码

组件方法还允许我们轻松创建和维护实体的组合,如驾驶员、乘客和行为驾驶员界面、乘客界面,只要将相关组件组合起来即可


它是Java不支持的多重继承的最佳替代方案,而且它更好、更清晰。

这是dasblinkenlight提供的答案的扩展

该解决方案基于Tony Hawk开发团队的团队负责人在20世纪90年代描述的组件模式,通常用于游戏开发

免责声明:我将在没有Java编译器的情况下编写代码,因此请告诉我是否存在语法错误

你的抽象类人物 这样我们就暴露了司机的行为 这里我们导出乘客的行为 在这里,我们给出了驱动程序的实际逻辑 这里我们把乘客的逻辑放在这里 最后是驱动程序类 乘客舱呢 收尾 我真的希望没有语法错误

这种方法的威力在于我们不复制Dri的逻辑 因为我们只在相关组件中编写一次此代码

组件方法还允许我们轻松创建和维护实体的组合,如驾驶员、乘客和行为驾驶员界面、乘客界面,只要将相关组件组合起来即可


它是Java不支持的多重继承的最佳替代方案,而且它更好、更清晰。

如果驱动程序始终是乘客,为什么不将驱动程序作为乘客的子类?一种解决方案dasblonkenlight方法。其他解决方案:使用组合的角色列表的人。相关:如果它看起来像鸭子,像鸭子一样呱呱叫,但需要战斗人员-你可能有错误的抽象概念如果司机总是乘客,为什么不让司机成为乘客的子类?一个解决方案是dasblonkenlight方法。其他解决方案:使用合成的角色列表的人。相关:如果它看起来像鸭子,像鸭子一样呱呱叫,但需要战斗人员-你可能有错误的抽象
class PassengerComponent {

    private Person person;   

    public PassengerComponent(Person person) {
        self.person = person;
    }

    public void drive() {
        System.out.println("My name is " + person.name + " and I'm passenger");
    }
}
class Driver extends Person implements DriverInterface, PassengerInterface {
    private DriverComponent driverComponent;
    private PassengerComponent driverComponent;
    private String name;

    public Person(String name) {
        driverComponent = DriverComponent(this);
        passengerComponent = PassengerComponent(this);
    }

    public void drive() {
        driverComponent.drive();
    }

    public void seat() {
        passengerComponent.seat();
    }

}
class Passenger extends Person implements Passenger {

    private DriverComponent driverComponent;
    private PassengerComponent driverComponent;
    public String name;

    public Passenger(String name) {
        driverComponent = DriverComponent(this);
        passengerComponent = PassengerComponent(this);
    }

    public void seat() {
        passengerComponent.seat();
    }
}