JAVA(android)中另一个类/子类的类/子类复合的最佳实践,涉及list <class subclass =“”>返回方法

时间:2018-01-11 20:33:49

标签: java list inheritance subclass covariance

例如,假设我有一个班级

class Engine {
    int horsepower;
    ...
}

和子类

class EngineTurbo extends Engine {
    Some turbineProperty;
    ...
}

另一方面,我有一个类(有一些List返回方法)

class Plane {
    Engine[] planeEngines;
    ...

    public List<Engine> getListOfEngines() { ... }
}

这是我的问题,有这个子类:

class PlaneTurbo extends Plane {
    EngineTurbo[] planeEngines;    // yes or no?
    ...

    public PlaneTurbo(int quantity){
        planeEngines = new EngineTurbo[quantity];    // yes? or...
        super.planeEngines = new EngineTurbo[quantity];
    }

    public List<EngineTurbo> getListOfEngines() { ... }    // best practices here
}

我想了解返回列表中的最佳做法&lt; SubClass&gt;案件。 我找到了一些关于使用List&lt;的答案。 ?扩展引擎&gt;和那样的东西

同样发现这个很棒的help (I share with all of you),但我仍在为这个案例寻找最佳解决方案

由于

啊,顺便说一句,在所有这些之后,我有另一个类(不是子类,或者也许是),像......

class HangarOnlyTurboPlanes {
    List<PlaneTurbo> turboPlanes;    // only PlaneTurbo, not need Plane
    ... 
    public void someLogicInvolvingOnlyTurboPlanes(){
        List<EngineTurbo> engines = turboPlanes.get(some).getListOfEngines();
        ...
    }
}

如果你问为什么,我和#34; TURBO&#34;应用程序,但我喜欢保持它对未来的另一个upperClass应用程序(可能只是Hangar)和/或siblingClass应用程序(可能是SpaceEngineHangar无论如何)开放

再次感谢

1 个答案:

答案 0 :(得分:1)

您的示例是泛型的候选者。 Plane将引用不具体的Engine,而是引用由Engine的子类指定的Plane的泛型子类。

将您的Plane更改为通用:

public class Plane<E extends Engine> {
    E[] planeEngines;

    public List<E> getListOfEngines() {return Arrays.asList(planeEngines);}
}

然后在您的子类中,您所要做的就是指定Engine的具体类型,而不需要定义一个新变量来保存EngineTurbo列表:

public class PlaneTurbo extends Plane<EngineTurbo> {
    public PlaneTurbo(int quantity) {
        planeEngines = new EngineTurbo[quantity];
    }
}

最后,您可以从EngineTurbo获取PlaneTurbo,而无需定义仅返回EngineTurbo或某种类型的广告投放的新方法:

PlaneTurbo pt = new PlaneTurbo(5);        
List<EngineTurbo> ets = pt.getListOfEngines();