使用隐式向下转换的调用方法

时间:2017-05-29 16:11:44

标签: java oop design-patterns

我将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));

基本上我需要根据孩子的类型执行不同的操作,我需要访问特定孩子中的所有方法。不同的孩子有不同的方法,他们只有一种共同的方法。

3 个答案:

答案 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)

  

基本上我需要根据孩子的类型执行不同的操作,我需要访问特定孩子中的所有方法。

在这种情况下,您要实现的行为属于此专用类。

您可以将另一个(抽象)方法签名添加到您在提供类型依赖行为的子类中实现的基类。