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方法?我在问题中提到的解决方案如何?它确实解决了我的问题。但好方法是我想知道的吗?