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

时间:2011-10-26 02:51:26

标签: java oop

我有两个抽象类,我们称之为CarWheel。我正在使用一些继承来处理不同类型的汽车。因此,我们假设有两个派生MonsterTruckCarToyCar。此外,还有不同类型的轮子与Car对应,比如说TreadedWheelPlasticWheel(映射不一定需要与类型一对一)汽车的类型轮子)。进一步CarWheel组成。

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

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

此外,如何将Wheel添加到Car中的合成/集合中。也就是说,我需要能够向Wheel添加可变数量的具体Car,进一步这将基于一些用户输入。所以我想在默认构造函数中有一个while循环,如果他/她想要添加另一个轮子,则提示用户,然后如果他/她这样做,我将另外Wheel添加到聚合/收集它们的任何内容{ {1}}的

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

1 个答案:

答案 0 :(得分: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
    }
}