2016-05-25 12 views
1

継承されたクラスのスーパーメソッドを変更したいと思います。私はそれのようなものを持っています:継承されたスーパーメソッドを変更する

ご覧のとおり、ときどき私はAの方法と時にはBの方法を使う必要があります。では、どうしたらいいですか?

+5

私は短い答えがあると思います:あなたはしないでください。あなたはあなたの構造について考えるべきであり、a - > b - > c構造なしでこれを解決しようとします。あなたのデザインと、なぜこれが起こったのかを考えてみましょう。この「問題」がここにあるという事実は「コードの匂い」と呼ばれ、何かがおそらくオフであることを意味します – Nanne

答えて

0

は、それは右ではないのですが、あなたは常にフラグを追加することができ、あなたのB.java

class A { 

    public void method() { 
     // Do something here 
     ... 
    } 
} 

class B extends A { 

    public void preserveMethodA(){ 
     super.method(); 
    } 

    @Override 
    public void method() { 
     // Do something here 
     ... 
     preserveMethodA() 
    } 

} 

class C extends B { 

    @Override 
    public void method() { 
     if(useB()) { 
      // Use B's method 
      super.method(); 
     } else { 
      // Use A's method 
      super.preserveMethodA() 
     } 
    } 

} 
0

に保存方法を追加します。フラグがtrueの場合はBメソッドが呼び出され、falseの場合はメソッドが呼び出されます。

class A { 
    public void method(boolean flag) { 
     // Do something here, ignore flag 
    } 
} 

class B extends A { 
    @Override 
    public void method(boolean flag) { 
     if (flag) { 
      //do something 
     } else { 
      super.method(); 
     } 
    } 
} 

class C extends B { 
    @Override 
    public void method(boolean flag) { 
     super.method(useB()); 
    } 
} 
0
C.method()の条件 if (useB())外を移動し、いずれか A又は BuseB()の結果に依存する Cのインスタンスをアップキャストとupcastedインスタンスに method()を呼び出す

関連する問題