2012-04-22 80 views
0

您好我有一個類物業和2個亞類公寓如何在Java中訪問特定的子類方法?

在另一類我有屬性的與商店和公寓的混合物的ArrayList。我的代碼:

for(Property prop: properties){ 
    if(prop.getClass().equals(Shop.class)) 
     prop.setShopDetails(detail); 
    else 
     prop.setAppDetails(detail) 
} 

如何訪問方法setShopDetails()店類的內部?

回答

6

你需要轉換propShop

for(Property prop: properties){ 
    if(prop.getClass().equals(Shop.class)) 
     ((Shop) prop).setShopDetails(detail); 
    else 
     ((Apartment) prop).setAppDetails(detail) 
    } 
} 

一個更好的辦法,但是,這是在Property類中定義的抽象方法setDetails並在每個子類中有不同的實現它。您可能還想使用prop instanceof Shop而不是prop.getClass().equals(Shop.class)

+0

感謝您的幫助。 – Qor 2012-04-22 19:03:14

0

首先,事實上,你必須調用在這種情況下getClass()通常表明設計缺陷。您可能想要有一個由子類覆蓋的單個abstractsetDetails方法。

你所追求的是「鑄造」的語言特性。調用子類方法之前,你想投你Property像這樣:

所有的

((Shop)prop).getShopDetails(detail);

2

首先,考慮propShop一個子類的情況。你的條件將返回false!這是使用instanceof operator的最佳時機。

爲了訪問這些方法,您需要將對象轉換爲正確的子類:

if(prop instanceof Shop) { 
    Shop s = (Shop) prop; 
    s.setShopDetails(details); 
} else { 
    // you get the idea 
} 

然而,這種失敗的多態性的目的。爲什麼不在Property中創建setDetails方法,並允許子類如何處理它?