1

私がしようとしているのは、抽象クラスにフィールドがあり、この抽象クラスが子クラスに継承されているときに、そのフィールドをクラスの子として持つことができることです。抽象親でabastractの親フィールドのサブクラスを指定する方法

たとえば、Playerを継承する抽象的なPlayerクラス、次にClientとOpponent(マルチプレイヤーゲーム用)があります。プレイヤーにはユニット型のフィールドがあります。ユニット自体はClientUnitとOpponentUnitによって継承されます。クライアントのコンストラクタにClientUnitを渡してUnit(継承、duh)として割り当てることができますが、例外や危険を冒すことなくClientUnitオブジェクトの形式で返すゲッターはどのようにして得られますか?

編集:問題をより詳しく説明するためにいくつかのコードを追加しました。

public abstract class Player { 
    private Unit unit;   

    public void setUnit(Unit unit) { 
     this.unit = unit; 
    } 
    public Unit getUnit() { 
     return unit; 
    } 
} 

public class Client extends Player { 
    @Override 
    public ClientUnit getUnit() { 
     return (ClientUnit)super.getUnit(); 
    } 
} 

これは機能しているようですが、それが安全で堅牢な方法であるかどうかはわかりません。

+0

何の例外?何を試しましたか?戻り値の型をより具体化するためにメソッドをオーバーライドすることができますか? –

+1

いくつかのコードを提供してください、より多くの人々があなたの問題を解決しようとするでしょう。ビジターパターンが必要なように見えます。 –

+0

私は抽象クラスでユニットフィールドをプライベートにして、getterとsetterをそこから使用してみました。そして、それらのgetterとsetterをClientUnitやstuffへのキャストでオーバーライドしましたが、それを行う堅牢な方法ではありません。 – Whiskydog

答えて

1

public abstract class Player<T extends Unit> { 

    private T unit; 

    public Player(T unit) { } 

    public T getUnit() { 
     return unit; 
    } 

    public void setUnit(T unit) { 
     this.unit = unit; 
    } 
} 

と実装クラス:

public class Client extends Player<ClientUnit> { 

    public Client(ClientUnit unit) { 
     super(unit); 
    } 

    public static void main(String[] args) { 
     Client client = new Client(new ClientUnit()); 
     ClientUnit unit = client.getUnit(); 
    } 
} 
-1

privateではなく、親クラスのフィールドをprotectedに設定する必要があります。このように、フィールドはサブクラス内でアクセス可能です。私はあなたの質問を理解しているが、多分Type Parametersはあなたを助けることができるかわからない

+1

これは、ClientUnitオブジェクトの形でそれを返す_aゲッターとは何が関係していますか? –

+0

@SotiriosDelimanolis私は、このフィールドにアクセスし、サブクラスのコンストラクターを介して値を渡すことなくゲッターに渡すことができるという質問を理解しました。解決策は、保護されたフィールドにアクセスすることです。たぶん私は間違った質問を持っていますが、それは私がそれを読んだものです。 – mumpitz

関連する問題