[英]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
中是抽象的,但在ClassB
和ClassC
。 然后,您遍歷數組並在其中的每個對象上調用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.