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();
}
有更好的方法吗?或者这个有什么改进吗?
除非在父类/接口本身中声明了 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() {
}
}
我最终采用的方法是使用
FooInterface
方法定义一个接口 foo()
并让所有子类实现它,然后我可以将 obj 类型转换为该接口并调用像这样的 foo()
方法:
Parent obj = ...// Object of one of the child classes
.....
if(obj instanceof FooInterface){
((FooInterface)obj).foo();
}
多态性应用于对象引用,而不是类型。当你打电话时
FooInterface obj = ...// Object of one of the child classes
obj.foo();
调用子类方法
foo()
。
如果您只想进行类型转换,则无需添加接口。您可以将其类型转换为所需的类并调用该方法。示例
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
您可以实现从
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
。