如何处理Java中的组合/聚合和多态性

Jor*_*dan 5 java oop

我有两个抽象类,让我们给他们打电话Car的和Wheel的.我正在使用一些继承来处理不同类型的汽车.所以我们说有两个推导MonsterTruckCarToyCar.另外,有不同类型的轮子对应于Cars,比如TreadedWheel's和PlasticWheel's(映射不一定需要从汽车类型到轮子类型一对一).进一步CarWheel's 组成.

我认为我可以在Java中执行此操作的方式是使用Car's 属性作为类型ArrayList<Wheel>.我遇到的问题是,现在当我想在我不能使用多态时,Wheel因为每当我处理一个Wheel时,它都是通过一个ArrayList不是派生类Wheel的.

我以为我可以使用有界通配符,或者只是使用很多switch语句来处理不同的组合,但我不认为其中任何一种都是最好的解决方案.我该如何处理这样的结构?

此外,你如何添加Wheel's的组合/集合Car.也就是说,我需要能够以具体的变量量增加Wheel的一个Car,进一步这是根据了一些用户输入的打算.所以我想在默认构造函数中有一个while循环,如果他/她想要添加另一个轮子,则提示用户,然后如果他/她确实添加了另一个Wheel聚合/收集它们Car的东西.

编辑:编辑类本身的名称,从复数(Wheels)到单数与's(Wheel's)来澄清关系.添加了最后一段,进一步解释了我正在寻找的行为.

Boh*_*ian 5

将通用参数添加到指定轮类型的Car类.这是您可以构建的非常基本的实现:

编辑:

包括更新的要求,这是棘手的,但可行...

public interface Wheel {
    void setSize(int diameter);
}

public static abstract class Car<T extends Wheel> {

    private List<T> wheels = new ArrayList<T>();

    protected Car(int numberOfWheels, Class<T> wheelClass) {
        while (wheels.size() < numberOfWheels) {
            T wheel;
            try {
                wheel = wheelClass.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e); // simplified exception handling
            }
            wheel.setSize(5); // Ask user for wheel details etc
            wheels.add(wheel);
        }
    }

    public List<T> getWheels() {
        return wheels;
    }
}

public static class PlasticWheel implements Wheel { // or extends Wheel
    @Override
    public void setSize(int diameter) {
    }
}

public static class ToyCar extends Car<PlasticWheel> {
    public ToyCar() {
        super(6, PlasticWheel.class); // or you could pass number of wheels in to this constructor
    }
}

public static class TreadedWheel implements Wheel { // or extends Wheel

    @Override
    public void setSize(int diameter) {
    }
}

public static class MonsterTruckCar extends Car<TreadedWheel> {
    public MonsterTruckCar() {
        super(4, TreadedWheel.class); // or you could pass number of wheels in to this constructor
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当你有多种类型需要通用时,这种设计的问题就开始了:Car <W延伸轮,S延伸座,D延伸驱动器,G延伸齿轮箱,M延伸马达> ...... (3认同)