我将List定义为
List<ParentClass> parentClassList;
父类是抽象的,所以当我向List添加元素时,我会执行类似
的操作parentClassList.add(new ChildClassOne(...));
parentClassList.add(new ChildClassTwo(...));
等等......我现在实际上有5个子课程。
我想做的是在另一个类中调用一个方法,覆盖它的参数,所以:
public void doSomething(ChildClassOne arg) {...}
public void doSomething(ChildClassTwo arg) {...}
但是如果List的类型是父类我不能做
doSomething(parentClassList.get(0));
基本上我需要根据孩子的类型执行不同的操作,我需要访问特定孩子中的所有方法。不同的孩子有不同的方法,他们只有一种共同的方法。
答案 0 :(得分:3)
在doSomthing()
中定义一个抽象方法ParentClass
,并在每个子类中实现它:
class ChildClassOne {
void doSomething() {
instanceOfSomeOtherClass.doSomething(this); // will call the correct method
}
}
和SomeOtherClass将为每个子类提供方法:
class SomeOtherClass {
void doSomething(ChildClassOne o) {};
void doSomething(ChildClassTwo o) {};
void doSomething(ChildClassThree o) {};
...
}
您可以阅读有关Visitor Pattern
的此方法 如果您将代码从SomeOtherClass
移到ChildClass
es,可能会更简单。
答案 1 :(得分:2)
在这种情况下,名为Visitor Pattern的双重调度技术变得非常方便:
BasesHelper
当你需要根据孩子的类型执行一些不同的任务时,提供interface Visitor {
void visitChildOne(ChildOne child);
void visitChildTwo(ChildTwo child);
void visitChildThree(ChildThree child);
}
abstract class ParentClass {
public abstract void accept(Visitor v);
...
}
class ChildClassOne extends ParentClass {
@Override
public void accept(Visitor v) { v.visitChildOne(this); }
}
class ChildClassTwo extends ParentClass {
@Override
public void accept(Visitor v) { v.visitChildTwo(this); }
}
class ChildClassThree extends ParentClass {
@Override
public void accept(Visitor v) { v.visitChildThree(this); }
}
界面的实现,并将其传递给你的每个孩子的Visitor
希望处理:
accept
答案 2 :(得分:2)
基本上我需要根据孩子的类型执行不同的操作,我需要访问特定孩子中的所有方法。
在这种情况下,您要实现的行为属于此专用类。
您可以将另一个(抽象)方法签名添加到您在提供类型依赖行为的子类中实现的基类。