0

嗨,我有一个类Property和 2 个子类ShopApartment

在另一个类中,我有一个包含商店和公寓的属性的数组列表。我有代码:

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

如何访问 shop 类中的 setShopDetails() 方法?

4

3 回答 3

6

您需要转换propShop

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

然而,更好的方法是在类中定义一个抽象方法setDetailsProperty在每个子类中以不同的方式实现它。您可能还想使用prop instanceof Shop而不是prop.getClass().equals(Shop.class).

于 2012-04-22T18:49:10.120 回答
2

首先,考虑prop是 的子类的情况Shop。您的 if 条件将返回false!这是使用instanceof 运算符的最佳时机。

为了访问这些方法,您需要将对象转换为正确的子类:

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

但是,这种方式违背了多态性的目的。为什么不在其中创建一个setDetails方法Property并允许子类以它们的方式处理它呢?

于 2012-04-22T18:51:08.523 回答
0

首先,在这种情况下你必须打电话的事实getClass()通常表明设计有缺陷。您可能希望有一个abstract setDetails被子类覆盖的方法。

您正在寻找的语言功能是“铸造”。在调用子类方法之前,您希望Property像这样进行转换:

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

于 2012-04-22T18:50:25.047 回答