これ。しかし、オーバーライドされたメソッドが基本クラスのみを呼び出す場合はどうなるでしょうか。これは悪い/良いデザインですか?奇妙に思えますが、とにかくベースを呼び出すためだけにメソッドをオーバーライドするのはなぜですか?
例:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
コメント
- 目的はなく、コードが乱雑になるだけなので、削除してください。
- @DavidArno that '私もそう思ったのですが、'理由がないことを確認してから
- 理想的な世界では、アプリはユニットテストなので、削除できます。すべてのテストに合格した場合は、'必要がないことがわかります'。 '常にその理想的な世界に住んでいるとは限らないので、質問するのが賢明でした:)
- 私が' dは、過去にオーバーライドされたメソッドにさらにコードがあり、削除された場合の上記のようにコードを残しますが、ソース管理システムの古いバージョンで表示できます。このように現在のコードにアーティファクトを残すと、今日の開発者に、以前のバージョンのメソッドのファイル'の履歴を表示するように通知できます。
回答
しかし、オーバーライドされたメソッドが基本クラスのみを呼び出す場合はどうなるでしょうか。これは悪い/良いデザインですか?
悪いデザイン?いいえ、かなり悪い実装です。メンテナンスプログラマーにとっては誤解を招く恐れがあります。オーバーライドが表示されない場合は、ベースが呼び出されていることを知っています。オーバーライドは、ベースがそこで呼び出されたとしても、何か違うものがあることを教えてくれます。
テンプレートなしでベースを呼び出すためにオーバーライドが必要なのは悪い設計です
スカンジナビアのオーバーライドに対する最初の反応モデルは次のとおりです。コーディングホラー! 「サブビヘイビア」がコードを壊さないようにするために、さらにそのすべてを読む必要があるようです。
テンプレートメソッドパターンは、より大きなコードフロー内で変数コードを表現し、正しい実行順序を確保するための優れた方法です。
私の経験では、サブクラスが知っている必要があるのは非常に一般的です。呼び出すベース宣言メソッドとその順序。すべて同じカットアンドペースト制御構造を持つ少数のサブクラスを山積みし、5年間のメンテナンスを追加します。これで、私が101プルーフのワイルドターキーを好む理由がわかりました。
P.S。これが、abstract
クラスの代わりにinterface
を使いすぎないようにする大きな理由の1つです。
コメント
- C#でのインターフェイスの過剰使用は、実装者をその特定の抽象基本クラスに縛り付けたくないことが原因である可能性があります。インターフェイスを使用すると、実装者は、特定の抽象クラスだけでなく、別の基本クラスを実装できます。しかし、それは状況に大きく依存します。
IFoo
インターフェースとIFoo
クラスの両方を用意することをお勧めします。
インターフェース、抽象メソッド-メソッドの呼び出しと小道具の自動プロパティ。たぶんctorも投入します。
回答
IMO、virtual
メソッドには、非常に基本的な実装があります。子クラスのvirtual
メソッドの定義をoverride
しても、virtual
メソッド(基本的な実装)は意味があり、子クラスのoverridden
メソッドの意図された動作には影響しません。
たとえば、BaseCalculator実際の仕事をします。電卓は、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が実際の作業を行います 。 電卓は、BaseCalculatorライブラリを拡張して装飾しています。
お役に立てば幸いです!