2017-07-11 4 views
0

親クラスの変数の拡張バージョンを使用する必要がある拡張クラスがあります。これまでのところ私はこのようにそれを使用して離れてなってきました:Javaの子クラスで親変数の拡張バージョンを使用する

public class ParentClass 
{ 
    protected ParentVariable variable; 

    public ParentClass(){ 
     this.variable = new ParentVariable(); 
    } 
    .... 
} 

public class ChildClass extends ParentClass 
{ 
    public ChildClass(){ 
     super(); 
     this.variable = new ChildVariable(); 
     //Where ChildVariable Extends ParentVariable 
     .... 
    } 
} 

私はChildVaribleにキャスト変数を使用しますが、これは醜いですし、いくつかの問題を投げるたびに限り、これは多かれ少なかれ作品を。これを実行するより良い方法はありますか?ありがとう。

+0

不明確:スーパークラスのすべてのメソッドがサブクラスでも表示されている場合は、なぜそれを常にキャストする必要がありますか? –

+0

ChildClassで変数がどこに定義されていますか? –

+2

@EugeneS OPは 'ChildClass'がコード内で' ParentClass'を拡張することを忘れたと思います。 –

答えて

2

それはあなたのスーパークラスの抽象化を行うことが可能だ場合は、ジェネリックを使用してこれを解決することができます:私はあなたのフィールドには、プライベート作ら

public abstract class ParentClass<T extends ParentVariable> 
{ 
    private T variable; 

    protected T getVariable(){ 
     return variable 
    } 

    protected void setVariable(T variable){ 
     this.variable = variable; 
    } 
    .... 
} 

public class ChildClass extends ParentClass<ChildVariable> 
{ 
    public ChildClass() { 
     setVariable(new ChildVariable()); 
     //Where ChildVariable Extends ParentVariable 
     ChildVariable foo = getVariable() // no cast nessecary 
    } 
} 

注意してください。サブクラスでも、getterメソッドとsetterメソッドによってフィールドに常にアクセスする必要があります。

これが可能でない場合(おそらくそうだったとしても)、デザインに欠陥があることを示す指標となります。クリーンなアーキテクチャを実現するには、クラスのすべてをリファクタリングする必要があります。残念ながら、これは4つのクラスすべての実装全体、おそらくそのクラスが使用されているコンテキスト全体に依存しています。その答えはstackexchangeにとっては広すぎます。

+0

答えをお寄せいただきありがとうございます。これは本当に興味深い解決策ですが、残念ながら親クラスを抽象化できません。 –

+0

@SamuelJonesの私の編集を参照してください –

関連する問題