[英]Cast parent to its child
我有:
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
。 現在嘗試cast (String) new Object()
。 根本沒有任何意義。
因為你的對象無論如何都不是B
,所以它不可能有B的行為。
你想要的是使用裝飾模式。 見http://en.wikipedia.org/wiki/Decorator_pattern
下面是一個Decorator實現的示例:
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();
那不行。 c.returnA()
返回一個A
A
不是 B
(A B
是 A
,但在這里這是不相關)。
njzk2的答案是完美的。 無論如何,如果你最后閱讀這篇文章並且喜歡我,你不喜歡重寫每一種方法,你可以這樣做:
public class B extends A {
public B(A nonDecorated) {
this.anotherValueOfA = nonDecorated.getAnotherValueOfA();
}
@Override
public String getID() {
return "id of B";
}
}
不需要覆蓋每個方法,並且使用其父級的值構造對象。
當然,這是假設A類是:
class A {
private int anotherValueOfA;
public String getID() {return "id of A";}
public int getAnotherValueOfA() {return this.anotherValueOfA;}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.