我有:
class A
{
public String getID() { return "id of A";}
}
class B extends A
{
public String getID() { return "id of B"; }
}
和
class C {
public A returnA() {
return new A();
}
}
现在我不知何故需要做:
C c = new C();
B b = (B)c.returnA();
String id = b.getId();
但是我无权访问C.returnA()
的实现,并且我无法将它的返回类型更改为B。
最佳答案
您正在将父项转换为子项。
你永远不能那样做,因为 new A()
绝对不是 B
。
考虑一下:String extends Object
。现在尝试转换 (String) new Object()
。这根本没有任何意义。
因为您的对象无论如何都不是 B
,所以它不可能具有 B 的行为。
你在这里想要的是使用装饰器模式。参见 http://en.wikipedia.org/wiki/Decorator_pattern
下面是装饰器的实现示例:
public class B extends A {
private A decorated;
public B(A decorated) {
this.decorated = decorated;
}
@Override
public String getID() {
return "id of B";
}
@Override
public void otherMethodOfA() {
return decorated.otherMethodOfA();
}
}
请注意,必须覆盖 A 的所有方法,以确保您在装饰元素上调用该方法。 (这里以otherMethodOfA
为例)
像这样使用:
C c = new C();
B b = new B(c.returnA());
String id = b.getID();
关于java - 把 parent 投给它的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957598/