簡體   English   中英

Java-對象類型轉換和繼承

[英]Java - Object Type Casting and Inheritance

我有超類A,它由子類B1和B2擴展。 然后,我有五個擴展B1或B2的子類(C1,C2,C3,C4,C5)。

我正在嘗試制作一個包含這五個子類之一的數組。

這些對象都實例化為類型A的實例。

ClassA[] objects = new ClassA[5];

我嘗試將每個對象重新分配給子類之一:

objects[0] = new ClassC1;
objects[1] = new ClassC2;  // etc...

此時,A類中存在的任何方法都可以正常工作,但是找不到B1 / B2或其他子類中定義的方法:

objects[0].MethodFromC1();   // returns a "symbol not found" error 

instanceof關鍵字指示object [0]是類A,B1 / B2和C1的實例。

在使我的代碼能夠識別子類的方法的同時,我該如何維護類對象的數組(循環並執行操作)?

如果您要基於類執行大量的instanceof和條件邏輯,則完全會錯過面向對象語言的好處。 只要堅持C。

例如,您應該具有一些do()方法,該方法在ClassA中是抽象的,但在ClassBClassC 然后,您遍歷數組並在其中的每個對象上調用do() 多態調用將導致調用正確的do()

希望能有所幫助。

您可以在if語句中使用instanceof關鍵字,並將對象轉換為所需的類型。 例如,

for (ClassA obj : objects) {
    // do something common...

    if (obj instanceof ClassC1) {
        ClassC1 c1Obj = (ClassC1) obj;
        c1Obj.MethodFromC1();
    }
}

objects數組中的元素對ClassC1因為只能保證它們是ClassA成員。

例如,如果您有Animal ,類Cat和子類Lion的類層次結構,則嘗試調用Animal.maimSafarigoer()方法。 一般而言, Animal對獵殺者一無所知,只有Lion知道如何做。

使用instanceof運算符可檢查您是否對特定的子類型進行操作。

(對不起的類比,很抱歉。:-))

您正在嘗試用Java實現變體。 長期以來,這個主題一直是我最討厭的一種語言。

http://jazzjuice.blogspot.com/2010/10/6-things-i-hate-about-java-or-scala-is.html

我列出了大約8種進行變體的次佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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