2014-08-28 96 views
0

我有一個擴展類的問題。放入擴展類中父類

這是類:

class A{ 
} 

class B extends A{ 
} 

現在的問題是,我有一個返回的方法是這樣的:

public A doSomthing(){ 
} 

現在我嘗試做這樣的事情:

public static void main(){ 
    B b = new B(); 
    b = doSomething(); 
} 

但它似乎沒有工作。有什麼辦法可以解決這個問題嗎?

我想到的唯一的事情是它有這樣的事情:

class B extends A{ 
public B(A a){ 
    copy all the fields from A to B} 
} 

然後執行:

A a = new A(); 
a = doSomthing(); 
B b = new B(a); 

是否還有更好的選擇嗎?

+0

你能否解釋一下什麼'DoSomething的()'應該做的事?它看起來像你正在使用它[工廠方法](http://en.wikipedia.org/wiki/Factory_method_pattern)。 – 2014-08-28 16:12:25

回答

0

您實例化對象bB型的,而不是A因此呼籲doSomthing

更改對象b爲類型A

+0

是的,但我不能做這樣的事情: b.SomeMethodADontHave(); – etlsh 2014-08-28 13:49:39

+0

@ user3659858看看Jon Skeet關於使用Composition來代替繼承的部分。 – gtgaxiola 2014-08-28 13:58:19

3

從根本上說,我認爲你已經錯過了polymorphism是行不通的什麼賦值運算符的確如此。本聲明:

b = doSomething(); 

改變的b對什麼doSomething()方法返回的值。它不取決於所有的現有值b。所以同樣,當你有:

A a = new A(); 
a = doSomthing(); 

...它會更有意義寫:

A a = doSomething(); 

現在,如果你需要創建一個基於A實例的B一個實例,然後它很可能是有意義的寫:

A a = doSomething(); 
B b = new B(a); 

或者只是:

B b = new B(doSomething()); 

...但您需要了解何時使用現有值以及何時不使用。

通常我發現,當我需要做這樣的事情,它實際上是更好的使用比繼承組成反正 - 這B應該有一個參考現有A而不是擴展A。這當然值得考慮,但沒有一個具體的例子,我們不能肯定地說。

+0

我更喜歡我寫的方式,在分配之前聲明變量更方便,更安全。特別是如果你只是在內部執行任務,如果/嘗試... – etlsh 2014-08-28 13:49:18

+0

+1繼承的組合! – gtgaxiola 2014-08-28 13:57:20

0

Java沒有多重繼承(c# example)來執行方法簽名。相反,它將使意義

public static A doSomthing(){ 
    A result = new A(); 
    ... 
    return result; 
} 

然後你可以使用:

A a = A.DoSomthing(); 
B b = (B)A.DoSomthing();