0

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

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 背后的想法搞砸了,两个类都实现的接口也是一个坏主意,因为普通的咖啡不能摇晃。那么如何处理呢?

4

3 回答 3

2

使用运算符测试是否m为 a 。MyclassWithAwesomeStuffinstanceof

if (m instanceof MyclassWithAwesomeStuff)
{
    MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m;
    // Now you can access "awesomeStuff" with "mwas"
}
于 2013-05-20T20:48:37.840 回答
1

只需使用一个接口:

interface AwesomeStuffable{

    public boolean isAwesome();

}

让你的类实现它:

class MyClass implements AwesomeStuffable{

  public boolean isAwesome(){

    //your logic here

  }

}

让你ArrayList只拿着AwesomeStuffable物体。

于 2013-05-20T20:50:18.280 回答
0

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

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

    }
}

但是,使用 instanceof 违背了继承的目的,并且只需要检查代码中的某些对象的此标志似乎是一个设计缺陷list。如果您扩展上下文,可能会提出更好的建议。

于 2013-05-20T20:50:21.193 回答