Я не могу найти решение этой проблемы наследования. Я работаю над программой, которая будет хранить информацию о небесных телах. У меня есть абстрактный суперкласс, 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;}
}
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
, который описывает основу любого небесного тела). Я пробовал использовать интерфейсы с методами по умолчанию, но ключевая проблема заключается в том, что реализация включает в себя чтение или изменение состояния объекта, что не может быть реализовано с интерфейсами, потому что все переменные в интерфейсе неявно статичны c.
Я также просмотрел этот и этот пост об очень похожих проблемах, но наследование состояния вызывает у меня горе.
Итак, как я могу решить эту множественную проблема наследования? Это вообще возможно в Java? Есть ли другие конструкции, которые могут обойти эту проблему? Спасибо.