C# におけるオーバーライドとメソッドの隠蔽について理解する
この記事では、C# におけるオーバーライドとメソッド非表示の 2 つの強力だが混同されやすい継承メカニズムの違いを明確にします。 適切なアプローチを選択することは、堅牢で保守可能なオブジェクト指向アプリケーションを構築するために重要です。
オーバーライド: 基本クラスの動作の拡張
オブジェクト指向プログラミングの基礎であるオーバーライドを使用すると、派生クラスは、基本クラスですでに定義されているメソッドに特化した実装を提供できます。 重要なのは、メソッドのシグネチャ (名前、パラメーター、戻り値の型) が変更されていないことです。 これにより、宣言された型ではなく、オブジェクトの実行時の型に基づいて正しいメソッドが実行されるポリモーフィズムが可能になります。
メソッドの隠蔽: 基本クラスのメソッドの隠蔽
これとは対照的に、メソッドの隠蔽には、基本クラスのメソッドと同じ名前を共有するが、異なるシグネチャ (異なるパラメーターの型や戻り値の型など) を持つメソッドを派生クラス内に作成することが含まれます。 これにより、派生クラス内の基本クラスのメソッドが効果的にマスクされます。 コンパイラは、変数の宣言された型に関係なく、常に派生クラスのメソッドを呼び出します。
オーバーライドとメソッドの隠蔽の戦略的適用
基本クラスのメソッドの基本的な目的を維持しながら、その動作を拡張または改良する必要がある場合は、オーバーライドが推奨される選択肢です。 これは、ポリモーフィズムを実装し、健全なオブジェクト指向設計原則を遵守するために不可欠です。
メソッドの隠蔽はあまり一般的ではなく推奨されないこともありますが、ニッチな用途が見つかります。
具体例
C# コードの例を見てみましょう:
<code class="language-csharp">class BaseClass { public virtual void DisplayNumber() { Console.WriteLine(12); } public virtual void DisplayText() { Console.WriteLine("abc"); } } class DerivedClass : BaseClass { public new void DisplayNumber() { Console.WriteLine(42); } public override void DisplayText() { Console.WriteLine("xyz"); } } BaseClass baseInstance = new BaseClass(); BaseClass derivedInstance = new DerivedClass(); DerivedClass clearlyDerived = new DerivedClass(); baseInstance.DisplayNumber(); // Output: 12 baseInstance.DisplayText(); // Output: abc derivedInstance.DisplayNumber(); // Output: 12 derivedInstance.DisplayText(); // Output: xyz clearlyDerived.DisplayNumber(); // Output: 42 clearlyDerived.DisplayText(); // Output: xyz</code>
DisplayNumber()
が DerivedClass
に隠されているのに対し、DisplayText()
はオーバーライドされていることに注目してください。 出力は、ランタイム型がどのメソッドが実行されるかをどのように決定するかを示しています。
結論: 明確にするためにオーバーライドを優先する
オーバーライドにより、確立されたインターフェイスを壊すことなく、派生クラスが基本クラスの機能を調整できるようになります。 メソッドの隠蔽は限られた状況でのみ役立ちますが、曖昧さを避け、明確な継承階層を維持するために慎重に使用する必要があります。 ほとんどのシナリオでは、オーバーライドにより、よりエレガントで保守しやすいソリューションが提供されます。
以上がC# でのオーバーライドとメソッドの非表示: いつどちらを使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。