调用存在于子类中但不存在于父类中的方法

时间:2014-05-06 08:55:31

标签: java oop class-design instanceof

public class Parent {
    ....
}

public class Child1 extends Parent {
    ....
    public void foo() {
        ....
    }
}

public class Child2 extends Parent {
    ....
    public void foo() {
        ....
    }
}

此处方法foo()仅存在于Child类中,不能添加到Parent类(甚至不是抽象方法)。在这种情况下,当我想在foo() obj上引用Parent方法时,我需要使用intanceof多个if..else Parent obj = ...// Object of one of the child classes obj.foo(); 我想避免的。

obj

编辑:我只需要使用Parent类型作为FooInterface。否则我将无法调用父类中存在的obj上的方法。


我的解决方案:我想的方法是定义一个接口说foo()obj方法并让所有子类实现它,然后我就可以了键入if(obj instanceof FooInterface){ ((FooInterface)obj).foo(); } 到该接口并调用foo()方法,如下所示:

{{1}}

有更好的方法吗?或者对这个有什么改进?

5 个答案:

答案 0 :(得分:1)

多态性应用于对象引用,而不是类型。当你打电话

FooInterface obj = ...// Object of one of the child classes
obj.foo(); 

调用子类方法foo()

答案 1 :(得分:1)

在父类/接口本身中声明除非方法之前,您无法使用父对象引用。

你必须将它转发给子类,因为父类/接口除了在它们之间定义的合约之外,没有任何关于子类的知识。

此处contract表示abstract methods


您可以尝试这种方式,无需进行检查。

FooInterface sc =new Child1();
sc.foo();

...

interface FooInterface{
    void foo();
}

public class Parent {

}

public class Child1 extends Parent implements FooInterface{

    public void foo() {

    }
}

public class Child2 extends Parent implements FooInterface{

    public void foo() {

    }
}

答案 2 :(得分:1)

我最终采用的方法是使用FooInterface方法定义一个接口说foo()并让所有子类实现它,然后我可以输入obj到该接口并调用这样的foo()方法:

Parent obj = ...// Object of one of the child classes
.....
if(obj instanceof FooInterface){
    ((FooInterface)obj).foo();
}

答案 3 :(得分:0)

如果您只想进行类型转换,则无需添加接口。您可以将其类型转换为所需的类并调用该方法。实施例

public class HelloWorld {
    public static void main(String args[]) throws FileNotFoundException {
        SuperClass sc =new Child1();
        if(sc instanceof Child1)//Do same for Child2
        ((Child1)sc).foo();
    }
}

class SuperClass {

}

class Child1 extends SuperClass{
    public void foo(){
        System.out.println("From child1");
    }
}

class Child2 extends SuperClass{
    public void foo(){
        System.out.println("From child2");
    }
}

输出: 来自child1

答案 4 :(得分:0)

您可以实施从AbstractChild继承的Parent,然后扩展此类而不是Parent

public class Parent {
    ....
}

public abstract class AbstractChild extends Parent{

    public abstract void foo();

}



public class Child1 extends AbstractChild {
    ....
    public void foo() {
        ....
    }
}

public class Child2 extends AbstractChild {
    ....
    public void foo() {
        ....
    }
}

因此,您只需检查您的实例是否为instanceof AbstractChild