Java ArrayList 由一个抽象类和任何扩展它的类组成?

ely*_*ely 3 java arraylist

我知道这是一个基本问题,但我找不到其他 StackOverflow 帖子或任何关于此的好的 API 文档。

假设我有一个像这样的抽象类Appliance,然后我有一些像ToasterBlender扩展这样的类Appliance。现在假设我想创建一个包含混合元素的 ArrayList,所有这些元素最终都是其成员,Appliance但也可以是ToasterBlender也是。本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”方法。

我认为这个练习是为了教我们:你将如何改造别人的糟糕设计工作,以尽量减少未来的损害。

gui*_*low 5

如果要使用抽象类并且所有子类实际上都具有相同的功能,为什么不在抽象基类中使用名为“turnDeviceOff”的函数并相应地在子类中覆盖它。这就是面向对象的方法。