【问题标题】:Method That Takes Super Class As Parameter And Manipulates Sub Classes以超类为参数对子类进行操作的方法
【发布时间】:2020-06-13 15:17:08
【问题描述】:

我有一个类“A”,它有两个类“BC”和“BD”的对象的两个数组列表。 BC 和 BD 继承自抽象类“B”。

所以我正在努力做的是,我想做一个 add();该方法以B对象为参数,如果参数为BC类型,则添加BC对象,如果参数为BD类型,则添加BD对象。有没有正确的方法可以做到这一点,或者我应该单独添加方法?

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bcArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList)
        {
            //m = create new object of type, either BC or BD;
            bArrayList.add(m);
        }
   }

【问题讨论】:

  • 我不明白你的例子,参数是一个列表,你添加一个对象而不是添加到一个实例变量?
  • 对不起,这个例子不清楚,我只想不使用两种添加方法,一种用于 bcArrayList,一种用于 bdArrayList,而是我想将这些数组之一传递给一种添加方法并获得工作完成。

标签: java polymorphism aggregation


【解决方案1】:

尝试使用 getClass 方法,即 m.getClass()。

【讨论】:

  • 我知道这种方法。但是,我听说使用 getClass 或 instanceof 是一种不好的做法,有正确的方法吗?
  • 尝试为类的类型添加一个字段,例如布尔 isBC。
【解决方案2】:

如果你真的需要这样做,那么我想你可以这样做:

public class A {
     private List<B> bcArrayList = new ArrayList<>();
     private List<B> bdArrayList = new ArrayList<>();

     public void add(List<B> bArrayList) {
         for (B item : bArrayList){

             if (item.getClass() == BC.class) {
                 bcArrayList.add(item);

             } else if (item.getClass() == BD.class){
                 bdArrayList.add(item);
             }
         }
     }
}

也就是说,你确定你真的需要那个吗?

为什么不将它们放在同一个列表中(它们都是B 类型的对象)并且具有子类BCBD 根据需要表现不同。这就是多态性的全部意义所在。

【讨论】:

  • 我不想做任何不好的做法,那么有没有办法以一种好的 OOP 方式做到这一点?
  • 您希望根据对象的类将对象拆分为不同的列表,在某些时候您必须检查该类。真正的问题是你为什么要这样做,因为你用polymorphism标记了这个问题。
  • 当我必须调用它们自己的一些方法时,将它们放在同一个 arrayList 中会不会导致问题?
  • 即便如此,我将如何根据一种添加方法请求的内容添加 BD 或 BC 对象?
【解决方案3】:

我认为最安全的方法是使用 instanceof 运算符。

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bdArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList) {
            for(B element : bArrayList) {
             if(element instanceof BC) {
                 bcArrayList.add((BC) element);
             } else if (element instanceof BD) {
                 bdArrayList.add((BD) element);
             } else {
                 continue;
             }
             }
        }
   }

【讨论】:

    【解决方案4】:

    我认为,如果您想从列表中添加多个对象,那么有一种方法采用 List&lt;B&gt; 并使用 instanceof

    public void add(List<B> bList) {
        for (B b : bList) {
            if (b instanceof BC) {
                bcArrayList.add((BC)b);
            }
            if (b instanceof BD) {
                bdArrayList.add((BD)b);
            }
        }         
    }
    

    但是对于添加单个对象,我认为使用方法重载是最干净的方法

    public void add(BC b) {
        bcArrayList.add(b);
    }
    
    public void add(BD b) {
        bdArrayList.add(b);
    }
    

    当然,您可以将它们全部添加到您的班级并像这样使用它们

    A a = new A();
    a.add(new BC());
    a.add(new BD());
    List<B> list = new ArrayList<>();
    list.add(new BC());
    list.add(new BD());
    a.add(list);
    

    【讨论】:

    • 我认为重载可以解决我的问题,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2017-04-09
    相关资源
    最近更新 更多