2009-04-01 3 views
3

と呼ばれ、いくつかのパラメータ* /)が呼び出され、isValid()メソッドが呼び出されます。 isValid()メソッドは具象クラスでのみ実装され、親クラスから継承したクラスプロパティも使用されることに注意してください。 superを呼び出す以外にisValid()が呼び出されるようにする方法はありますか? 私はパラメータをすべて渡す必要があるという事実を非常に嫌っています。私は完全に間違った方向に行き、これを達成するためのよりクリーンな方法があると思います。 私のコードに残したいのは、抽象クラスの "isValid()呼び出しロジック"です。なぜなら、すべての呼び出しを検証する必要があり、将来このことを思い出すことができないからです。P確保の方法は、私は、このクラスを持っている

ありがとうございます:

答えて

14

テンプレートメソッドのパターンに従ってchangeStatus()を実行するように思えます。

public final void changeStatus() 
{ 
    doSomethingSubclassSpecific(); 
    isValid() 
} 


protected abstract doSomethingSubclassSpecific(); 
+0

ほとんど同じように投稿されています...これは非常に一般的なパターンです。 – Varkhan

+0

メソッドは常に最終的なものでなければなりません(人々が適切に拡張することを信頼しない場合だけでなく)。テンプレートメソッドパターンは、メソッドが最終的であることを意味します。呼び出しのシーケンスを保証する唯一の方法です。 – pgras

+0

"保証する唯一の方法"は、エクステンダを信用できないように聞こえますが:-)はい、私はあなたに同意します適切なインプリメンテーション – kdgregory

2

あなたがする必要はありません。(あなたが適切に拡張するために人々を信用していない場合、それは最終的になって)、それが必要なメソッドを呼び出す必要があり、このパターンでは、抽象クラスでchangeStatus()を定義しますオーバーライドchangeStatus()Template Methodデザインパターンを実装するのに非常に近いです。

2

最終的にchangeStatusを作成し、上書きできるcustomChangeStatusメソッドへの呼び出しを追加することができます。 以下のように:あなたは常にそれを実装する必要はありませんので、

パブリック抽象クラスAbstractIncomingCall {

/* 
class properties 
*/ 

public final void changeStatus(/*some parameters*/){ 
    //store parameters in class properties 
    isValid(); 
    customChangeStatus(); 
} 

protected abstract void customChangeStatus(); 
protected abstract boolean isValid(); 

}

あなたもcustomChangeStatusのための空のメソッドを実装することができます。 changeStatusでfinalを使用すると、クラスを呼び出すときにロジックになることが確実です。また、カスタムビヘイビアを追加する柔軟性はまだあります。

0

私は、継承ではなく構成を使用することをお勧めします。そのようなことがもっと明白になるはずです。

+0

もっと正確に言えば分かりますか? –

関連する問題