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

问题描述 投票:0回答:5
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
。否则,我将无法调用
obj
类中存在的
Parent
上的方法。


我的解决方案:我正在考虑的方法是定义一个接口来用

FooInterface
方法表示
foo()
并让所有子类实现它,然后我可以将
obj
类型转换为该接口并像这样调用
foo()
方法:

if(obj instanceof FooInterface){
    ((FooInterface)obj).foo();
}

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

java oop class-design instanceof
5个回答
2
投票

除非在父类/接口本身中声明了 except 方法,否则无法使用父对象引用来执行此操作。

您必须将其向下转换为子类,因为父类/接口除了它们之间定义的契约之外不了解子类。

这里

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
投票

我最终采用的方法是使用

FooInterface
方法定义一个接口
foo()
并让所有子类实现它,然后我可以将 obj 类型转换为该接口并调用像这样的
foo()
方法:

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

1
投票

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

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

调用子类方法

foo()


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");
    }
}

输出: 来自孩子1


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

© www.soinside.com 2019 - 2024. All rights reserved.