Base
というメソッドを持つというクラスがありexecute()
ます。この基本クラスから派生し、独自の実装を提供する約100のクラスがありますexecute()
。今、私は私が入れたいいくつかの共通論理を持っていBase.SomeMethod()
ます。このメソッドは、の最後に呼び出す必要がありexecute()
ます。すべての派生クラスのexecute()
メソッドを変更せずにこれを呼び出すことができるかどうかという私の質問はありますか?
5 に答える
public class Base {
public final void execute() {
doExecute();
someMethod();
}
protected abstract void doExecute();
public void someMethod() {
}
}
このソリューションは、スーパーコードの臭いを防ぎます。
はい。ただし、発信者を変更する必要があります。呼び出し元は、基本クラスでfinalとして定義し、次に共通コードを呼び出すdoExecute()
(より適切な名前を見つける)メソッドを呼び出す必要があります。execute()
もう1つのオプションはアスペクト指向プログラミングですが、この目的、つまりコードを「ハッキング」するためにはお勧めしません。
問題は、100程度のクラスのメソッドの名前を変更することがなぜこのような問題なのかということです。IDEでマウスをクリックするだけです。
私が知っていることではありません。次回は、すべての拡張クラスに共通のアクションを追加することを検討し、super.execute()
!を呼び出す必要があります。
コードをインストルメント化するものを使用することによってのみ。これは純粋なJavaでは不可能です。
私が理解しているようにあなたの問題を述べさせてください:動物クラスには実装があるBreath()メソッドがあり、継承のためにすべてのサブクラスにこのメンバーがあり、呼吸の方法が大きく異なる場合を除いて、誰もオーバーライドしません。
ここで、Breathメソッドの最後で、動物クラスのCloseEyes()メソッドを呼び出します。これは、サブクラスの一部またはすべてがCloseEyes()メソッドをオーバーライドする場合もあります。
だからあなたの問題:あなたがCloseEyesに望む動物の呼吸はいつでも、派生クラスからではなく、動物クラスからです。
多くの派生クラスにすでにCloseEyes()メソッドがある場合は、基本クラスのCloseEyes()を呼び出す際に実際に何か問題が発生しています。
それでも基本クラスのメソッドのみを呼び出したい場合は、なぜ同じメソッド名が必要なのですか。AnimalEyeClose()とだけ言って、プライベートにし、Animalクラスに入れます。