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