this などのオーバーライドされたメソッド内で基本メソッドを呼び出すことについて質問があることは知っています。しかし、オーバーライドされたメソッドが基本クラスのみを呼び出す場合はどうなりますか?これは悪い/良い設計ですか?それは奇妙に思えますが、なぜとにかくベースを呼び出すためだけにメソッドをオーバーライドするのですか?
たとえば、次を参照してください。
public class BaseClass
{
virtual public void Method1()
{
//Do stuff
}
}
public class InheritingClass : BaseClass
{
override public void Method1()
{
base.Method1();
}
}
しかし、オーバーライドされたメソッドが基本クラスのみを呼び出す場合はどうでしょうか?これは悪い/良いデザインですか?
悪いデザイン?いいえ、かなり悪い実装です。これは、メンテナンスプログラマにとって誤解を招く可能性があります。オーバーライドが表示されない場合、knowベースが呼び出されます。オーバーライドは、ベースがそこで呼び出されていても、何か違うものがあることを教えてくれます。
テンプレートなしでベースを呼び出すためにオーバーライドを要求するのは悪い設計です
私の初期スカンジナビアのオーバーライドモデルへの反応は:CODING HORROR! 「副動作」が私のコードを壊さないように、またその逆を確認するために、私はそれらすべてを読むことを余儀なくされているようです。
テンプレートメソッドパターン は、いくつかのより大きなコードフロー内で可変コードを表現し、正しい実行順序を保証するための良い方法です。
私の経験では、サブクラスがどの基本宣言メソッドを呼び出すか、そして順番に知る必要があるのは非常に典型的です。同じカットアンドペースト制御構造を持つ多数のサブクラスを積み上げ、5年間のメンテナンスを追加します。これで、なぜ私が101証明を好むのか理解できます ワイルドターキー 。
追伸これらすべてが、interface
クラスの代わりにabstract
sの過剰使用に反対する大きな理由の1つです。
基本クラスのIMO、virtual
メソッドには、非常に基本的な実装があります。子クラスのoverride
メソッドの定義をvirtual
した場合でも、virtual
メソッドを(基本的な実装で)呼び出すことができますが、子クラスのoverridden
メソッドの意図した動作には影響を与えません。
たとえば、BaseCalculatorは実際の作業を行います。 CalculatorはBaseCalculatorライブラリを拡張して装飾しています。
public class BaseCalculator
{
public virtual T Add<T>(T number01, T number02)
{
return number01 + number02;
}
}
public class Calculator: BaseCalculator
{
public override T Add<T>(T number01, T number02)
{
Console.WriteLine(number01 + " | " + number02);
var result = base.Add<int>(1, 3);
Console.WriteLine("Result: "+ result);
return result;
}
}
Q:オーバーライドされたメソッドが基本クラスのみを呼び出す場合はどうなりますか?
A:あなたの場合、基本クラスメソッドをvirtual
として、その動作を変更するまでoverride
にする必要はありません。
Q:これは悪い/良い設計ですか?
A:はい、不要なオーバーライドを追加する際にソースコードファイルが乱雑になる可能性があるため、設計が悪い可能性があります。
Q:奇妙に思えますが、とにかくベースを呼び出すためだけにメソッドをオーバーライドするのはなぜですか?
A: BaseCalculatorが実際の作業を行います。 CalculatorはBaseCalculatorライブラリを拡張して装飾しています。
それが役に立てば幸い!