检查子类的属性

我偶然发现了这种情况,但我不知道如何以正确的方式处理它:

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 } } 

让你的ArrayListAwesomeStuffable对象。

只是为了让自己畅通无阻,您可以执行以下操作:

 if (m instanceof MyClassWithAwesomeStuff) { if (((MyClassWithAwesomeStuff) m).awesomeStuff) { } } 

但是,使用instanceof会破坏inheritance的目的,并且在代码中list中的某些对象需要检查此标志似乎是一个设计缺陷。 如果扩展上下文,可能会建议更好的内容。