2016-02-23 54 views
4

在Java中,我被賦予了一項任務。我可以大致描述了我的問題與它如下:使用其他子類的子類方法,橫向鑄造?

創建三個AB類和C

一個類的實例變量J,K,L,setter和getter方法,也方法X,這使得計算基於它們。

B類是A的一個子類,使用j,k,l覆蓋了方法x,並且具有相同的空簽名。

C類也是A的一個子類,並且有一個額外的類y可以做其他的垃圾。

現在,實例化一個C類對象,設置它的變量,execute方法X,然後使用方法x的從B類

我的問題是覆蓋版本中,我怎麼做,最後一部分?我認爲這個問題是不正確的,否則我解釋錯了。我可以將我的C類對象轉換爲類B對象,然後使用x()的B類版本?我對鑄造物體並不瞭解多少,以及是否可以從一個物體投射到另一個物體。上行可能與「橫向/橫向」鑄造一樣有損,但我從來沒有聽說過後者。是否不可能在類C中使用類B中的方法而不讓類C內部實例化並從它自己的變量重建類B對象?我有道理嗎?

附錄:

好的。因此,兄弟姐妹不能彼此被投擲?因爲C和B都是「[我]對象層次結構的一部分」。我可以鑄造,然後回到不同的子類嗎?就像把貓餵給動物課,然後把狗餵給動物一樣?因爲方法x依賴於類A和類B中的實例變量,所以在C中創建一個新的B實例將創建一個字段/變量不相同的對象,它們都將爲零或類似。所以我將不得不將每個j,k和l的值複製到C類對象中的新B類型對象中。這看起來像是浪費時間和內存,將對象變量複製到另一個非常相似的對象中。但是沒有其他辦法?

二附錄:

雖然我選擇了一個答案,我仍然好奇一般鑄造和我所說的橫向鑄什麼。如果B和C都是A的子類,你可以允許從B到C嗎?另外,一個人如何允許一般的投射?

+0

事實證明,是的,教授希望我們基本上看,這是不可能的,手動使用getter和setter以重建對象C的內部對象B的另一個實例,以便使用方法從x乙這是@Nathan Huges所描述的。 – adjenks

回答

3

鑄造意味着你比編譯器更瞭解你的對象。如果您投射到不屬於您的對象層次結構的部分,則在運行該程序時您將收到異常(特別是ClassCastException)。

您看到投射的最常見位置是Object#equals方法。等於需要將java.lang.Object作爲其唯一參數。如果你看看人們如何實現equals,你會看到測試傳入對象的類是什麼,如果它是預期的那麼就有一個強制轉換,以便後面的檢查可以使用該對象的字段。否則在初學者情況下鑄造不會出現太多。

鑄造不會改變你的對象,它只會試圖通知編譯器該對象在類型系統不足的情況下(如等於)。如果您使用層次結構中的虛擬方法創建對象,則強制轉換不會更改調用哪個版本的方法。

如果C不是B的子類,那麼你可以在C中創建一個類B的對象,作爲實例成員或者作爲B的某個方法的局部變量,然後調用C的方法:

class C extends A { 
    private B b; // instance member 

    public C(B b) { 
     this.b = b; 
    } 

    public void x() { 
     // do stuff 
     b.x(); 
    } 
} 
+0

所以你建議我必須在每個C類對象中注入一個B類對象,這對我來說似乎是一種浪費。無論如何,我可以避免重複所有的變量? – adjenks

+0

@ adjenks:不知道具體細節很難說。通常每個對象都有責任來定義它的範圍並決定何時需要單獨的實例。記住這是面向對象的,不是面向類或面向變量的。 –