我找不到这个继承问题的解决方案。我正在开发一个程序,该程序将存储有关天体的信息。我有一个抽象超类,Body
,所有其他天体都应该从它继承。现在,我希望一些天体在默认情况下实现用于存储有关轨道天体的信息;有些机构应该是Orbitable
,有些机构应该是Orbital
。例如,恒星是orbitable
唯一的,行星和卫星都是orbitable
和orbital
,而小行星是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中甚至可能吗?是否有其他设计可以规避这个问题?谢谢。
Orbitable
和Orbital
,为您想要的状态操作定义(但显然没有实现)方法。创建三个(抽象)类
OrbitableBody extends Body implements Orbitable
OrbitalBody extends Body implements Orbital
OrbitableOrbitalBody extends Body implements Orbitable, Orbital
并使这三个类从接口中实现方法。
Body
、OrbitableBody
、OribtalBody
或OrbitableOrbitalBody
。然后它们都将成为一个 Body,实现正确的接口,并继承接口定义方法的默认实现。
我将有两个接口,即:
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)
归档时间: |
|
查看次数: |
129 次 |
最近记录: |