簡體   English   中英

將父母加入其子女

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM