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}}
有更好的方法吗?或者对这个有什么改进?
答案 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
。