2014-05-06 22 views
4
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方法。


我的解决方案:,我想的方法是定义一个接口说FooInterfacefoo()方法,让所有的子类实现它,那么我可能只是类型转换的obj到该接口和呼叫foo()方法是这样的:

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

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

+0

每当一个方法在孩子中是常见的,它应该放在父母身上。为什么你不把该方法放入抽象类? –

+0

我无法更改'Parent'类,因为我不管理它。 – Learner

+0

然后使用答案中给出的解决方案中所述的接口。 –

回答

1

,我终于采取的方法是定义一个接口说FooInterfacefoo()方法,让所有的子类实现它,那么我完全可以用手投的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()被调用。

+1

再次查看OP问题。 'Parent'没有任何'foo()'方法。 – Braj

+0

@braj为什么不呢? –

+1

如何在接口的引用中调用接口尚未声明该方法的方法?看看我的帖子。 – Braj

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

+0

那么,这是我认为不是一个好方法,因此不想使用它。如果有多个子类,那么它会很难看。不是吗? – Learner

0

不能与父对象引用做直到除非方法在父类/接口本身声明。

因为父类/接口没有任何有关子类的知识,而不是它们之间定义的契约,所以你必须将它降级到子类。

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

    } 
} 
+0

有了这个解决方案,我将无法调用父类中存在的'sc'方法。我编辑了我的问题提到这一点。谢谢。 – Learner

+0

您是否让'Child1'实现了'Child2'的'FooInterface'? – Braj

+0

这就是我在My Solution中提到的,唯一不同的是在我的解决方案中,引用的类型为'Parent',因此我需要使用'instanceof'来查看它是否是'FooInterface'类型。 – Learner

0

你可以实现一个AbstractChildParent继承,然后,而不是延长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只检查。