将超类作为参数并操作子类的方法



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

所以我正在努力做的是,我想做一个加法((;方法,该方法将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);
}
}

我认为,如果您想从列表中添加多个对象,那么有一个方法可以使用List<B>并使用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);

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

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

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根据需要表现不同。这就是多态性的意义所在。

我认为最安全的方法是使用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;
}
}
}
}

最新更新