私はあるクラスの機能を拡張しようとしている状況に遭遇しましたが、これについて最善の方法を知りません。私は機能を "上向き"に呼び出すことから始め、今では "下向き"に切り替えましたが、私は両方の問題を見ています。私が何を意味するのか説明しましょう。まず、「上向き」アプローチ:機能を拡張する最善の方法は何ですか?
public class ParentValidator
{
public void validate() {
// Some code
}
}
public class ChildValidator extends ParentValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
完璧にこの機能が、それは、私はいつも私のメソッド本体に)(super.validateを配置するために覚えていることを必要とするか、または親クラス(ES)のロジックは」勝ちました実行される。さらに、このような拡張は、子クラスが親クラスで定義されたコードを実際に置換/変更できるという事実のために、「安全でない」とみなすことができる。これは、私が上級クラスからメソッドを呼び出すので、メソッドを "上向き"に呼び出すというものです。
これらの不足に対処するために、私はParentValidator.validate()を最終的にして別のメソッドを呼び出させることにしました。ここに私のコードは、に修正されたものです。これは私が、私は各クラスが継承チェーン「ダウン」のクラスにメソッドを呼び出すと、私は下向きに呼んでいることを言うときに言及されたものである
public class ParentValidator
{
public final void validate() {
// Some code
subValidate();
}
protected void subValidate() {}
}
public class ChildValidator extends ParentValidator
{
@Override
public final void subValidate() {
// Some code
subSubValidate();
}
protected void subSubValidate() {}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void subSubBalidate() {
// Some code
subSubSubValidate();
}
protected void subSubSubValidate();
}
。
この方法を使用すると、親クラスのロジックが実行されることが保証されますが、これは私が好きです。しかし、それはうまく拡張できません。私が持っているより多くの相続層、それは醜いです。あるレベルでは、これはとてもエレガントだと思います。 2つのレベルで、それは不毛に見えるようになります。 3つ以上では、それは恐ろしいです。
さらに、私の子供の検証メソッドの最初の行としてsuper.validate()を呼び出すのと同じように、私は今、いくつかの "subValidate"メソッドを呼び出す必要があります。私の親の検証方法は、それほど良くはないようです。
私が触れていないこのタイプの拡張を行うには、より良い方法がありますか?これらのアプローチのどちらかに重大な欠陥があり、私が使用できるより良いデザインパターンがあるかどうかは疑問です。
このアプローチの唯一の制限は、訪問しているオブジェクトに対してコールバックを行う必要があることです。オブジェクトが「閉じている」場合は、反射(醜い)に解決する必要があります。 –