如何绕过这个多重继承问题?

Oct*_*cta 5 java inheritance

我找不到这个继承问题的解决方案。我正在开发一个程序,该程序将存储有关天体的信息。我有一个抽象超类,Body,所有其他天体都应该从它继承。现在,我希望一些天体在默认情况下实现用于存储有关轨道天体的信息;有些机构应该是Orbitable,有些机构应该是Orbital。例如,恒星是orbitable唯一的,行星和卫星都是orbitableorbital,而小行星是orbital唯一的。

public abstract class Orbital {

    Body host;

    protected double avgOrbitalRadius;
    protected double orbitalPeriod;

    public double getOrbitalRadius(){return this.avgOrbitalRadius;}
    public double getOrbitalPeriod(){return this.orbitalPeriod;}

}
Run Code Online (Sandbox Code Playgroud)
public abstract class Orbitable {

    List<Body> satellites = new ArrayList<>();

    public void addSatellite(Body sat){
        satellites.add(sat);
    }

    public boolean hasSatellite(Body sat){
        for(Body body : satellites){
            if(sat.equals(body)) return true;
        }
        return false;
    }

    public boolean hasSatellite(String satName){
        for(Body body : satellites){
            if(satName.equals(body.getName())) return true;
        }
        return false;
    }

    public Body getSatellite(String satName){
        for(Body body : satellites){
            if(satName.equals(body.getName())) return body;
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要让对象能够继承上述实现中的一个、两个或两个(加上Body描述任何天体基础的超类)。我试过使用带有默认方法的接口,但关键问题是实现涉及读取或修改对象的状态,这不能用接口实现,因为接口中的所有变量都是隐式静态的。

我也看过这篇这篇关于非常相似问题的帖子,但是状态的继承让我感到悲伤。

那么,如何解决这个多重继承问题呢?在Java中甚至可能吗?是否有其他设计可以规避这个问题?谢谢。

Joh*_* H. 5

  1. 创建接口OrbitableOrbital,为您想要的状态操作定义(但显然没有实现)方法。

  1. 创建三个(抽象)类

    • OrbitableBody extends Body implements Orbitable
    • OrbitalBody extends Body implements Orbital
    • OrbitableOrbitalBody extends Body implements Orbitable, Orbital

    并使这三个类从接口中实现方法。


  1. 使您的天体从四个中扩展拟合类:BodyOrbitableBodyOribtalBodyOrbitableOrbitalBody

然后它们都将成为一个 Body,实现正确的接口,并继承接口定义方法的默认实现。


nab*_*ter 5

在此处输入图片说明 让我通过一些视觉帮助来解决这个经典的面向对象模式问题。

我将有两个接口,即:

Orbitable
Orbital
Run Code Online (Sandbox Code Playgroud)

然后是基类Body。您可以根据您的实现细节使其具体抽象。例如,您可以添加行为,例如它是否具有氛围?以方法的形式hasAtmosphere()。这可以是abstract首先然后让您的实现类覆盖它。

然后我将有两个额外的子类来扩展Body和实现每个接口(记住接口通过提供行为契约来分离职责)

BaseOrbitable
BaseOrbital
BaseOrbitalOrbitable
Run Code Online (Sandbox Code Playgroud)

最后是一些具体的(子类)实现示例:

public class Earth extends Planet {
}
Run Code Online (Sandbox Code Playgroud)

或者

public class Ceres extends Asteroid {
}
Run Code Online (Sandbox Code Playgroud)

或者

public class Sirius extends BaseOrbitable {
}
Run Code Online (Sandbox Code Playgroud)