检查子类的属性
我偶然发现了这种情况,但我不知道如何以正确的方式处理它:
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 coffees = new ArrayList();
所以在这个数组列表中存在普通咖啡对象和咖啡混合对象。 现在我要显示所有咖啡混合对象,这些对象是动摇的:
for(Coffee c : coffees) { //here is the same problem as above }
正如我从答案/评论中看到的那样:instanceof似乎是一个糟糕的主意,因为它破坏了oo up背后的想法,并且两个类实现的接口也是一个坏主意,因为普通的咖啡不能动摇。 那么如何处理呢?
测试m
是否是带有instanceof
运算符的MyclassWithAwesomeStuff
。
if (m instanceof MyclassWithAwesomeStuff) { MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m; // Now you can access "awesomeStuff" with "mwas" }
只需使用界面:
interface AwesomeStuffable{ public boolean isAwesome(); }
让你的类实现它:
class MyClass implements AwesomeStuffable{ public boolean isAwesome(){ //your logic here } }
让你的ArrayList
只AwesomeStuffable
对象。
只是为了让自己畅通无阻,您可以执行以下操作:
if (m instanceof MyClassWithAwesomeStuff) { if (((MyClassWithAwesomeStuff) m).awesomeStuff) { } }
但是,使用instanceof会破坏inheritance的目的,并且在代码中list
中的某些对象需要检查此标志似乎是一个设计缺陷。 如果扩展上下文,可能会建议更好的内容。