我找不到解决此继承问题的方法。我正在开发一个程序,该程序将存储有关天体的信息。我有一个抽象超类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;}

}
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;
    }
}

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

我也查看了有关非常相似问题的thisthis帖子,但是状态的继承使我感到悲伤。

那么,如何解决这个多重继承问题呢? Java甚至可能吗?还有其他设计可以解决此问题吗?
谢谢。

最佳答案

  • 创建接口OrbitableOrbital,它们定义(但显然不实现)您想要的状态操作的方法。


  • 创建三个(抽象)类
  • OrbitableBody extends Body implements Orbitable
  • OrbitalBody extends Body implements Orbital
  • OrbitableOrbitalBody extends Body implements Orbitable, Orbital

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

  • 使您的天体从以下四个类别中扩展拟合类:BodyOrbitableBodyOribtalBodyOrbitableOrbitalBody


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

    08-04 19:45