2017-05-28 2 views
1

スーパークラスからプロパティを設定するために抽象クラスを拡張することはできますか(JavaおよびSOLIDプリンシパルの場合)。 私が達成したいのは、p1の内容によってp2に異なる値を適用することです。また、p3の値はp2の値に依存します(メニューをカスケードするときも同様です)。 このシナリオをデザインパターンで処理できますか?抽象サブクラスを使用してスーパープロパティを設定する

public interface Iface{ 
    public void set_p1(int i); 
    public void set_p2(int i); 
    public void set_p3(int i); 
} 

public abstract class A implements Iface{ 
    private int p1; 
    private int p2; 
    private int p3; 

    public void set_p1(int i){ 
     this.p1 = i; 
    } 

    public void set_p2(int i){ 
     this.p2 = i; 
    } 

    public void set_p3(int i){ 
     this.p3 = i; 
    } 
} 

ここで私は今、私は今、私は

public class TestClass extends setTwo { 
    public TestClass(){ 
     super(); 
    } 
} 

TestClass myObj = new TestClass(); 
私setTwo抽象クラスをインスタンス化P1

public abstract class setTwo extends setOne { 
    public setTwo(){ 
     //do some work using p1 
     set_p2(200); 
    } 
} 

の値に応じて、P2を設定する100

public abstract class setOne extends A { 
    public setOne(){ 
     set_p1(100); 
    } 
} 

にP1を設定します

今、私はth電子オブジェクトは次のように:

myObj.p1 = 100 

myObj.p2 = 200; 
+0

すべてが myObj.p1上記のように動作しますが、実際に100あるとmyObj.p1について同じことが100 である私は、Javaに新しいですので、私は固体の校長で、どのように継承に準拠していますがやっていることかどうかを確認したいですjavaで使用されています。ありがとう。 –

答えて

1

これは何か複雑な注入です。 私は、あなたが1つの責任ある原則について考えすぎると感じます。

あなたがしなければならないことに基づいたデザインは、p1とp2によって異なります。 これを行うにはPOJOを使用することができます。

public abstract class A { 
    private int p1; 
    private int p2; 
    private int p3; 

    public void setP1(int i){ 
     this.p1 = i; 
    } 

    public void setP2(int i){ 
     //do some work using p1 
     this.p2 = i; 
    } 

    public void setP3(int i){ 
     this.p3 = i; 
    } 
} 

事前論理ベースを値で実行する必要がある場合は、setP2メソッドの実装を提供できます。

public interface NumberFunction { 
    int doCalculate(int number); 
} 

以下のように変更してください。

public void setP2(int i, NumberFunction function){ 
    int functionResult = function.doCalculate(p1); 
    this.p2 = i; 
} 

あなたの番号を変更する責任があります。値を保持する責任を持つクラス。

希望すると、これが役立ちます。

関連する問題