私はその状況に出くわしましたが、正しい方法で処理する方法がわかりません:
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の背後にあるアイデアを台無しにし、通常のコーヒーを振ることができないため、両方のクラスが実装するインターフェースも悪い考えであるため、悪い考えのようです。では、これをどのように処理しますか?