我知道这是一个基本问题,但我找不到其他 StackOverflow 帖子或任何关于此的好的 API 文档。
假设我有一个像这样的抽象类Appliance,然后我有一些像Toaster和Blender扩展这样的类Appliance。现在假设我想创建一个包含混合元素的 ArrayList,所有这些元素最终都是其成员,Appliance但也可以是Toaster或Blender也是。本Blender类有一个叫做方法turnBlenderOff()和Toaster类有一个方法turnToasterOff(),我会想遍历我ArrayList和调用这些方法,具体取决于哪个子类元素实际上属于。
目前我创建了一个名为的类PowerPoint并尝试:
// Constructor given an ArrayList of appliances.
public PowerPoint(ArrayList<Appliance> initial_list_of_appliances){
int listSize = initial_list_of_appliances.size();
for(int ii = 0; ii < listSize; ii++){
this.applianceList.add(initial_list_of_appliances.get(ii));
}
}
/////
// Method to switch everything in the list OFF simultaneously.
/////
public void switchOff(){
int N = this.applianceList.size();
String cur_name;
for(int ii = 0; ii < N; ii++){
cur_name = this.applianceList.get(ii).getClassName();
if(cur_name.equals("Blender")){
this.turnBlenderOff(this.applianceList.get(ii));
}
else if(cur_name.equals("Toaster")){
this.turnToasterOff(this.applianceList.get(ii));
}
else if(cur_name.equals("Oven")){
this.turnOvenOff(this.applianceList.get(ii));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的大部分代码编译良好,但我不断收到此错误消息:
PowerPoint.java:83: turnBlenderOff(appliances.ApplianceWrapper.Blender) in PowerPoint cannot be applied to (appliances.ApplianceWrapper.Appliance)
this.turnBlenderOff(this.applianceList.get(ii));
Run Code Online (Sandbox Code Playgroud)
我看到这种仅适用于Blender对象的方法试图在Appliance恰好是 aBlender但编译器没有意识到这一点的对象上执行。
我试图在 ArrayList 规范中替换<Appliance>类型<? extends Appliance>,但这会产生额外的错误并且不再编译。
根据抽象类型制作列表,然后通过使用类似getClassName()检索子类类型的方法调用子类类型的方法的正确方法是什么?
添加
由于很多人立即指出了一个显而易见的事实:更好地使用继承,我需要解释一下。对于这个项目,我们必须假设 的所有子类Appliance都是由第三方创建的,并放入一些我们无法更改的包中。这是以一种糟糕的、粗暴的方式完成的,其中所有不同的子类都有不同的开/关方法,并且无法更改。所以设计一个平滑的Appliance抽象类的选项对我来说是不开放的。例如,Toaster具有方法startToasting(),而Oven具有方法heatUp(),每个都充当两个不同类的“on”方法。
我认为这个练习是为了教我们:你将如何改造别人的糟糕设计工作,以尽量减少未来的损害。
| 归档时间: |
|
| 查看次数: |
9601 次 |
| 最近记录: |