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 に答える