2016-12-25 6 views
-1

Javaの問題に直面しています。複数のクラスを継承なしで同じ属性にする

同じ属性を持つ複数のクラスを持つ必要があります(たとえば、Positionとboolean isWalkable)。

しかし、これらのクラスがクラスElementから継承しないようにしておくと、後で継承を使用できないためです。

私はインターフェイスを考えました(そのインターフェイスには属性があります)が、クラスから継承するインターフェイスを持つことはできません。

もしそうでなければ私は自分の属性とメソッドをコピー/ペーストしなければならないので、方法が必要です。

この問題を解決する方法を知っている方は、事前におねがいします。

+0

*しかし、明らかにあなたはクラスから継承するインターフェースを持つことはできません*:なぜあなたはそれを望みますか?代わりにクラスでインターフェイスを実装する必要があります。ただし、属性を共有することはできません。メソッドシグネチャのみ。 –

+0

構図はどうですか?実際のクラスだけでなく、あなたの位置とisWalkableフィールドの両方を参照できるラッパークラスを設計し、コード内の他の場所を参照することができます。 –

+0

私のクラスはそれぞれあなたが提案するラッパークラスであるattribut要素を持つでしょうか? – Irindul

答えて

0

私はあなたが一般的にあなたのオブジェクトを扱いたい場合は、とにかくインタフェースを疑う必要があるかもしれません - 例えばそれらをすべてループし、それぞれを描画します。例えば。あなたの要素は、「猫」と「家」が含まれると仮定すると: - それはないかもしれませんが、他の回答が正しく述べたように

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なら歩くことができます)。

0

抽象基本クラスを拡張することができます(何も含まれていません)。または、デコレータパターンに関連する詳細については、linkを参照してください。

1

このため、私はcomposition over inheritanceと考えています。

public class Main { 

    public static void main(String[] args) { 
     AgentWrapper agentWrapper = new AgentWrapper(new Agent1(), false, 1); 
     System.out.println("isWalkable: " + agentWrapper.isWalkable()); 
     System.out.println("position: " + agentWrapper.getPosition()); 
     agentWrapper.getAgent().doSomething(); 
    } 
} 

interface Agent { 
    void doSomething(); 
} 

class Agent1 implements Agent { 

    public void doSomething() { 
     System.out.println("Agent1"); 
    } 
} 

class Agent2 implements Agent { 

    public void doSomething() { 
     System.out.println("Agent1"); 
    } 
} 

class AgentWrapper { 

    private final Agent agent; //Wrapped instance. 
    private final boolean isWalkable; 
    private final int position; 

    public AgentWrapper(Agent agent, boolean isWalkable, int position) { 
     this.agent = agent; 
     this.isWalkable = isWalkable; 
     this.position = position; 
    } 

    public Agent getAgent() { 
     return agent; 
    } 

    public boolean isWalkable() { 
     return isWalkable; 
    } 
関連する問題