在涉及列表<class/subclass> return 方法的JAVA (android) 中,class/subclass 分别与另一个class/subclass 组合的最佳实践

Best practices for class/subclass composite of another class/subclass respectively in JAVA (android) which involve list<class/subclass> return methods

例如,假设我有一个 class

class Engine {
    int horsepower;
    ...
}

和子class

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

另一方面,我有一个 class(使用一些 List return 方法)

class Plane {
    Engine[] planeEngines;
    ...

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

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

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
}

我想了解 return List < SubClass > 案例的最佳实践。 我找到了一些关于使用 List < ?扩展引擎 > 和类似的东西

也发现这个很棒 help (I share with all of you) 但我仍在为这种情况寻找最佳解决方案

谢谢

啊,顺便说一句,在所有这些之后我还有另一个 class(不是 subclass,或者可能是),比如...

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

如果你问为什么,我正在使用 "TURBO" 应用程序,但我希望它对未来的另一个上层应用程序(可能只是 Hangar)保持开放 and/or siblingClass 应用程序(可能是 SpaceEngineHangar随便)

再次感谢

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

将您的 Plane 更改为通用的:

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

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

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

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

最后,您可以从 PlaneTurbo 获取 EngineTurbo,而无需定义仅 returns EngineTurbo 或某种类型的转换的新方法:

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