检查子类的属性

时间:2013-05-20 20:46:54

标签: java class

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

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似乎是一个坏主意,因为它将背后的想法搞砸了,两个类实现的界面也是一个坏主意,因为正常的咖啡不能动摇。那么如何处理呢?

3 个答案:

答案 0 :(得分:2)

使用m运算符测试MyclassWithAwesomeStuff是否为instanceof

if (m instanceof MyclassWithAwesomeStuff)
{
    MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m;
    // Now you can access "awesomeStuff" with "mwas"
}

答案 1 :(得分:1)

只需使用界面:

interface AwesomeStuffable{

    public boolean isAwesome();

}

让你的类实现它:

class MyClass implements AwesomeStuffable{

  public boolean isAwesome(){

    //your logic here

  }

}

让你的ArrayList只保留AwesomeStuffable个对象。

答案 2 :(得分:0)

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

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

    }
}

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