我有两个抽象类,我们称之为Car
和Wheel
。我正在使用一些继承来处理不同类型的汽车。因此,我们假设有两个派生MonsterTruckCar
和ToyCar
。此外,还有不同类型的轮子与Car
对应,比如说TreadedWheel
和PlasticWheel
(映射不一定需要与类型一对一)汽车的类型轮子)。进一步Car
由Wheel
组成。
我认为我可以在Java中执行此操作的方法是使用Car
的属性作为类型ArrayList<Wheel>
。我遇到的问题是,现在当我想在Wheel
上使用多态时我不能,因为每当我处理一个Wheel时,它都是通过ArrayList
而不是Wheel
的派生类。 1}}的
我认为我可以使用有界通配符,或者只是使用很多switch语句来处理不同的组合,但我认为其中任何一种都不是最好的解决方案。我该如何处理这样的结构?
此外,如何将Wheel
添加到Car
中的合成/集合中。也就是说,我需要能够向Wheel
添加可变数量的具体Car
,进一步这将基于一些用户输入。所以我想在默认构造函数中有一个while循环,如果他/她想要添加另一个轮子,则提示用户,然后如果他/她这样做,我将另外Wheel
添加到聚合/收集它们的任何内容{ {1}}的
编辑:编辑类本身的名称,从复数(Car
)到单数用's(Wheels
')来澄清关系。添加了最后一段,进一步解释了我正在寻找的行为。
答案 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
}
}