您好我有一个属性类和2个子类购物和公寓。
在另一个班级,我有一个商店和公寓混合的arraylist。我有代码:
for(Property prop: properties){
if(prop.getClass().equals(Shop.class))
prop.setShopDetails(detail);
else
prop.setAppDetails(detail)
}
如何在商店类中访问方法setShopDetails()?
答案 0 :(得分:6)
您需要将prop
投射到Shop
:
for(Property prop: properties){
if(prop.getClass().equals(Shop.class))
((Shop) prop).setShopDetails(detail);
else
((Apartment) prop).setAppDetails(detail)
}
}
然而,更好的方法是在setDetails
类中定义抽象方法Property
,并在每个子类中以不同方式实现它。您可能还想使用prop instanceof Shop
代替prop.getClass().equals(Shop.class)
。
答案 1 :(得分:2)
首先,考虑prop
是Shop
的子类的情况。你的if条件会返回false
!这是使用instanceof operator的最佳时机。
要访问这些方法,您需要将对象转换为正确的子类:
if(prop instanceof Shop) {
Shop s = (Shop) prop;
s.setShopDetails(details);
} else {
// you get the idea
}
但是,这种方式违背了多态性的目的。为什么不在setDetails
中创建Property
方法并允许子类处理它们的方式呢?
答案 2 :(得分:0)
首先,在这种情况下你必须调用getClass()
这一事实通常表明设计错误。您可能希望有一个被子类覆盖的abstract
setDetails
方法。
您正在寻找的语言功能是“投射”。在调用子类方法之前,您希望像{so}那样强制转换Property
:
((Shop)prop).getShopDetails(detail);