2012-03-07 11 views
1

私は基本クラスXとそれを拡張するクラスYを持っています。 クラスXには、クラスYですべてオーバーライドされたメソッドがいくつかあります。 メソッドをオーバーライドしても、これらのメソッドの1つにいくつかのステートメントを入れたいと思います。クラスY.Java:オーバーライドされたメソッド内にある処理ステートメント

これを実行する方法はありますか?

public class X 
{ 
    protected void method() 
     { 
      // vital statements; 
     } 
} 

public class Y extends X 
{ 
    protected void method() 
      { 
      /* vital statements still need to happen 
      * would rather not have to call it 
      * in every single class that extends X 
      */ 
      // non vital statement; 
     } 
} 

答えて

3

に呼び出されることになるテンプレートメソッドを必要とする - と、本質的にのみ - これを行う方法はsuperを使用していますキーワード:

 protected void method() 
    { 
     super.method(); 
     non vital statement; 
    } 

「本質的にのみ」とは、これを行う他の方法があるので、彼らはより多くの変更が必要です。 1つの方法は、中央メソッドをfinalとpublic(それは呼び出すことができますが、上書きすることはできません)し、保護された抽象メソッド(オーバーライドできますが呼び出されない)を呼び出させることです。次に、抽象メソッドだけをオーバーライドすることによって、サブクラスの動作をカスタマイズできます。これはテンプレートメソッドパターンと呼ばれます。

あなたが望むものを達成するために第三の方法は、あなたの「重要な文は、」いくつかの舞台裏バイトコードの魔法を使用して、実行時にサブクラスのメソッドを追加したり、時間をコンパイルすることができ、アスペクト指向プログラミングを使用してaspects.を使用することです。これには特別なツールが必要になり、ビルドシステムにいくつかの複雑さが加わりますが、サブクラスの作者には完全に見えないという利点があります。

+1

'を呼び出す必要があります。 – amit

+0

は、Xを拡張するすべての単一のクラスのすべての単一のメソッドにコードを必要とします...しかし、これは私の後ろにあります – Troyseph

+1

"本質的にこれを行う唯一の方法"は正しいです。実際には別の方法はありません。 –

4

あなたはhttp://en.wikipedia.org/wiki/Template_method_pattern

バイタル文は、共通のテンプレートメソッド

public class X { 
    final void template() { 
    Vital statement; 
    method(); 
    } 

    void method() { 
    // do something; 
    } 
} 

public class Y extends X { 
    @Override 
    void method() { 
    // specific code to the class Y 
    } 
} 
+0

私はYでmethod()を呼び出すたびに、 "//何か"の部分もやっていますか? – Troyseph

+0

の 'method'を' Y'から呼び出すのではなく、 'template'メソッド(' X'から継承) –

1

いいえ、これは不可能です。おそらくtemplate methodを介して、あなたが望むものを達成するための別の方法を見つけなければなりません。

関連する問題