我偶然发现了这种情况,但我不知道如何以正确的方式处理它:
class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
public boolean awesomeStuff;
}
我将 Myclass 对象保存在 arraylist 中,稍后遍历此列表:
for(Myclass m : list) {
//here I want to check if awesomeStuff is true, in case it is a MyclasswithAwesomeStuff
}
这里的问题是:父类 Myclass 不知道 awesomeStuff 属性(它不应该,因为这是一个仅与派生类一起提供的功能)。但是我该如何管理呢?问题是,arraylist 包含 Myclass 和 MyclassWithAwesomeStuff 元素,foreach 循环总是将它们转换为 Myclass。
我想知道这是不是设计失败?
//编辑:
好的,为了让我的问题更具体一点,这里有更多信息。我正在尝试建立一个小咖啡店:
class Coffee { }
class CoffeeMix extends Coffee {
public boolean shaken;
}
我将咖啡项目保存在数组列表中:
ArrayList<Coffee> coffees = new ArrayList<Coffee>();
所以在这个数组列表中存在普通咖啡对象和咖啡混合对象。现在我想显示所有摇晃的咖啡混合对象:
for(Coffee c : coffees) {
//here is the same problem as above
}
正如我从答案/评论中看到的那样:instanceof 似乎是一个坏主意,因为它把 oo 背后的想法搞砸了,两个类都实现的接口也是一个坏主意,因为普通的咖啡不能摇晃。那么如何处理呢?