我偶然发现了这种情况,但我不知道如何正确处理:
class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
public boolean awesomeStuff;
}
我将 Myclass 对象保存在数组列表中,并稍后遍历此列表:
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 背后的想法搞砸了,两个类都实现的接口(interface)也是一个坏主意,因为普通的咖啡不能摇晃。那么如何处理呢?
最佳答案
使用 instanceof
运算符测试 m
是否为 MyclassWithAwesomeStuff
。
if (m instanceof MyclassWithAwesomeStuff)
{
MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m;
// Now you can access "awesomeStuff" with "mwas"
}
关于java - 检查子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16658109/