2015-07-21 65 views
1

讓我們設置一個假設的方案。我父類如何正確使用繼承並避免向下滾動

public class A { 
    protected void doSomething(){ 
     //do something the A way 
    } 
} 

而子類

public class B extends A{ 
    @Override 
    protected void doSomething(){ 
     // do something the B way 
    } 
} 

,我有一些假設類:

public class SomeClass implements someInterface{ 
    @Override 
    public void someMethod(A aObject){ 
     aObject.doSomething(); 
    } 
} 

但我想用B的行爲,我不能改變方法參數也不行,我也可以下調到B.

很明顯,我處理了一個更大的問題,但這是t他同樣的原則,我自己的答案是將A的屬性克隆到B中,然後使用B.但在此之前,我想聽到更多的意見。

編輯:約束,我不能將B的實例傳遞給方法,也不使用instanceof方法。

編輯2:因爲SomeClass的覆蓋從接口這個方法必須始終使用A.

的實例

編輯3我從來沒有收到B的一個實例:這是由設計不當遺留代碼,我跑生成的情況進入,我只是想找出更快,但乾淨的方式來解決作爲excercise。

+2

如果參數'A'是一個''instanceofB'','B'的'doSomething()'方法將被使用,因爲它是'Overriding'''的'doSomething()'方法。沒有必要將'A'轉換爲'B'來實現這個功能。 – CoderMusgrove

+0

[調用Java中的子類的方法]可能的重複(http://stackoverflow.com/questions/2701182/call-a-method-of-subclass-in-java) –

+0

「我永遠不會收到B的實例,因爲someClass從必須始終使用A的實例的接口覆蓋此方法。「你怎麼能確定你永遠不會收到一個B的實例(因爲B是-A)?我信任的唯一約束是'someInterface'中描述的約束。 – Spotted

回答

3

B實例只是傳遞到someMethod()因爲B「ISA」 A,它會工作,會調用BdoSomething()

+0

約束:我從來沒有收到B的實例 –

+0

那麼你的設計是錯誤的。如果你想在'A'(而不是子類'B')上調用''''doSomething()'',那麼這個代碼屬於'A'(或者某個實用程序包)。 – John3136

+0

同意,好的是,代碼不是我的準確,壞的是我必須處理它。謝謝約翰。 –

1

要使用類B的方法,您傳入的對象必須是類B的實例。然後,在執行aObject.doSomething()時,將自動調用類B的方法,因爲在運行時A對象將被標識爲實際上覆蓋了doSomething()方法的B對象。

+0

約束:如果你沒有一個BI的實例,我從來沒有收到B的實例 –

+0

@LuisDurazo不明白如何從對象的B類調用一個方法,除非方法是靜態的,重新傳遞它作爲參數。 B是A,但A不是B.它不是雙向的。所以,如果你收到一個A的實例,除非你能夠投它,你不能把它當作B. – Zarwan

+0

這就是問題,是否真的沒有辦法?,我不能克隆A以適應B並且全部爲null B的其他屬性? –

2

簡單的答案是,這是不可能的。

當您創建superclass的對象時,它不具有subclass的方法。因此,根本不可能在superclass對象上調用subclass方法。

1

另一個答案是,這是完全倒退到思考繼承的正確方式,以及由不同類調用的方法。

對B延長A,B必須是A的特殊情況,我們可以有passengerAuto /車輛,或圓/形狀之間的這種關係,等等

你似乎是試圖建立一個方法,然後創建一個繼承關係,以便您可以在兩個地方使用該方法。但是有很多地方可以從多個地方調用方法,而且這個方法非常糟糕。

不要這樣做。不要設計你的類,以便你可以進行'漂亮'的方法調用。這是面向對象的OO編程:「在這裏,拿着我的啤酒,看着這個。」

+0

我同意這是設計不佳,我不得不重構大部分它(這是我沒有寫的遺留代碼),謝謝阿西。 –