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

Java 调用存在于子类中但不在父类中的方法,java,oop,class-design,instanceof,Java,Oop,Class Design,Instanceof,这里方法foo()只存在于子类中,不能添加到父类(甚至不是抽象方法)。在这种情况下,当我想调用obj上的foo()方法,它是Parent类的引用时,我需要将intanceof与我想要避免的多个if..else一起使用 public class Parent { .... } public class Child1 extends Parent { .... public void foo() { .... } } public class Ch

这里方法
foo()
只存在于子类中,不能添加到父类(甚至不是抽象方法)。在这种情况下,当我想调用
obj
上的
foo()
方法,它是
Parent
类的引用时,我需要将
intanceof
与我想要避免的多个
if..else
一起使用

public class Parent {
    ....
}

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

public class Child2 extends Parent {
    ....
    public void foo() {
        ....
    }
}
编辑:我只需要将
obj
的类型用作
Parent
。否则,我将无法调用父类中存在的obj上的方法


我的解决方案:我正在考虑的方法是用
foo()
方法定义一个接口,比如说
foointerace
,然后让所有子类实现它,然后我可以将
obj
类型强制转换到该接口并调用foo()方法,如下所示:

Parent obj = ...// Object of one of the child classes
obj.foo();
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() {
        ....
    }
}

有更好的方法吗?或者对此进行任何改进?

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

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

调用子类方法
foo()

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

FooInterface obj = ...// Object of one of the child classes
obj.foo(); 
输出:
从child1开始,除非在父类/接口本身中声明了一个除非方法,否则不能使用父对象引用

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

这里的
合同
是指
抽象方法


你可以在不需要检查的地方用这种方法试试

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

您可以实现一个从父级继承的
抽象子级
,然后扩展这个类而不是父级:

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() {

    }
}

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

我最终采用的方法是使用
foo()
方法定义一个接口,比如
foointeraction
,并让所有子类实现它,然后我可以将obj类型强制转换到该接口并调用
foo()
类似这样的方法:

Parent obj = ...// Object of one of the child classes
obj.foo();
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() {
        ....
    }
}

只要一个方法在子级中是通用的,它就应该放在父级中。为什么不将该方法放在抽象类中?我不能更改父类,因为我不管理它。然后使用下面答案中给出的解决方案中所述的接口。你能在父类和子类之间引入一个中间类吗?再次看OP问题
Parent
没有任何
foo()
方法。如果接口未声明方法,如何在接口的引用上调用该方法?看看我的帖子。@ BRAJ现在你应该再次阅读OP问题,界面定义了一个方法FO。@学习者对你的评论,在设计你的类时,考虑对接口的编码,而不是对类的编码。@ RoNC,在这个解决方案中,我不能调用在<代码> Obj/<代码>中存在的方法,该代码存在于<代码>父< /代码>类中。是的,我理解代码到接口的优势,但这是遗留代码,我不能修改父类。我认为这不是一个好方法,因此不想使用它。如果有多个儿童班,那就很难看了。不是吗?使用此解决方案,我将无法调用父类中存在的
sc
上的方法。我编辑了我的问题以提及这一点。谢谢。您是否为
Child1
实现了
FooInterface
相同的
Child2
?这就是我在解决方案中提到的,唯一的区别是在我的解决方案中,引用的类型为
Parent
,因此我需要使用
instanceof
一次,以查看它是否属于
FooInterface
类型。因此,您不想更改设计,那么这是不可能的,因为我告诉过您Parent class/interface不了解子类。父类/接口如何知道子类创建了x方法?我在问题中提到的解决方案如何?它确实解决了我的问题。但好方法是我想知道的吗?