私はあなたが一般的にあなたのオブジェクトを扱いたい場合は、とにかくインタフェースを疑う必要があるかもしれません - 例えばそれらをすべてループし、それぞれを描画します。例えば。あなたの要素は、「猫」と「家」が含まれると仮定すると: - それはないかもしれませんが、他の回答が正しく述べたように
interface Element{
public point getPosition();
public boolean isWalkable();
}
class Cat implements Element{
private Point position;
private String catBreed; // example of cat-specific data
public point getPosition() {return position;}
public boolean isWalkable() {return true;} // cats can walk
...
}
class House implements Element{
private Point position;
private String streetAddress; // example of house-specific data
public point getPosition() {return position;}
public boolean isWalkable() {return false;} // houses cannot walk
..
}
// Finally, using that common interface:
Element[] allGameObjects= {new Cat(...), new Cat(...), new House(...) };
for(Element e:allGameObjects)
draw(e, e.getPosition());
私が書いたいくつかのシステムには十分だった...しかし、あなたは、組成物を使用するためにリファクタリングかもしれません100%クリアカット。私は、猫や家が自分の立場から独立して管理されなければならないかどうかを理解できます...しかし、ウォーキングはどうですか?
// Position is easy to separate:
class Cat { String catBreed; ... }
class House{ String streetAddress; ... }
class ElementWrapper implements Element{
Point position;
Object theObject; // could hold Cat or House
public Point getPosition() {return position;}
// however, isWalkable is a bit tricky... see remark below
}
しかし、「isWalkable」古典的な多型であなたは、彼らが歩くことができるかどうかを伝えるためにハウス/猫を期待するので、(彼らはとにかくインタフェースを実装する必要があります意味する)トリッキーです。あなたが絶対に望んでいない(または傾ける)ことができない場合、多態性を妥協し、instanceofの行で何かをするかもしれません(もしtheObjectがcatのインスタンスならば歩くことができ、歩くことができないinstanceofなら歩くことができます)。
*しかし、明らかにあなたはクラスから継承するインターフェースを持つことはできません*:なぜあなたはそれを望みますか?代わりにクラスでインターフェイスを実装する必要があります。ただし、属性を共有することはできません。メソッドシグネチャのみ。 –
構図はどうですか?実際のクラスだけでなく、あなたの位置とisWalkableフィールドの両方を参照できるラッパークラスを設計し、コード内の他の場所を参照することができます。 –
私のクラスはそれぞれあなたが提案するラッパークラスであるattribut要素を持つでしょうか? – Irindul