2014-07-25 95 views
3

我:鑄造父母給其子

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.

+1

C沒有擴展A因此你將無法將A投射到C – PaulHickman

+2

你並沒有試圖將一個孩子轉換爲其父 - 你試圖將一個父母('A')投射到孩子('B')。這顯然不起作用。 –

+1

c.returnA()返回A,不能強制轉換爲B.將拋出ClassCastException – Elbek

回答

11

您正在向父母投入一個孩子。 你永遠不能這樣做,因爲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(); 
+0

對不起,改名了。 – inside

+0

+1爲裝飾模式:) – NiziL

+0

謝謝,將檢查鏈接。 – inside

0

這是行不通的。 c.returnA()返回AA而不是 a B。 (A BA,但在這裏不相關)。