ホームページ >バックエンド開発 >C++ >C#継承におけるシャドーイングとオーバーライドの違いは何ですか?

C#継承におけるシャドーイングとオーバーライドの違いは何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-28 14:11:39368ブラウズ

What's the Difference Between Shadowing and Overriding in C# Inheritance?

c#継承されたシャドーイングとオーバーライドの差分説明

継承メカニズムでは、プログラマーは2つの非常に異なる技術に遭遇します:シャドーイング(隠された)とオーバーライド。 2つの微妙な違いを理解することは、継承を効果的に使用するために不可欠です。

オーバーライド

サブクラスステートメントでメソッドが発生した場合、ベースクラスで定義されているメソッドは同じ名前、返品タイプ、およびパラメーターリストを持っています。書き換えにより、基本クラスのメソッドのカスタム実装が可能になります。サブクラスオブジェクトが書き換え方法を呼び出すと、サブクラスのコードは基本クラスの方法の動作を効果的にカバーします。 対照的に、シャドウイング

メソッドがサブクラスステートメントで発生した場合、このメソッドのメソッドはベースクラスのメソッドと同じ名前を持っていますが、メソッドの署名(返品タイプまたはパラメーターリスト)は違う。新しい方法がサブクラスに隠されており、この方法をベースクラスの同じ名前に置き換えます。サブクラスのオブジェクト上の隠しメソッドを呼び出して、サブクラスでコードを実行し、ベースメソッドを効果的に隠します。

次の例を考えてみましょう

クラスAとBのオブジェクトでメソッドを呼び出すと、予想される出力は次のとおりです。

重要な違いは、Bオブジェクトをオブジェクトに変換するときです。
<code class="language-csharp">class A {
   public int Foo() { return 5; }
   public virtual int Bar() { return 5; }
}
class B : A {
   public new int Foo() { return 1; }     // 隐藏
   public override int Bar() { return 1; } // 重写
}</code>

非表示方法(FOO)の場合、基本クラスの実現を呼び出します。

<code class="language-csharp">A clA = new A();
B clB = new B();

Console.WriteLine(clA.Foo()); // 输出:5
Console.WriteLine(clA.Bar()); // 输出:5
Console.WriteLine(clB.Foo()); // 输出:1
Console.WriteLine(clB.Bar()); // 输出:1

// 将 B 转换为 A
Console.WriteLine(((A)clB).Foo()); // 输出:5</code>
書き換え方法(bar)については、サブクラスの実装を呼び出します。

    非表示(シャドウイング)
  • 基本メソッドが考慮されていないコードに依存している場合、問題がある可能性があります。偶発的な動作を引き起こし、デバッグを困難にする可能性があります。一方、オーバーライド
  • は、継承構造を維持しながら、実装する方法を変更する制御メカニズムを提供します。

以上がC#継承におけるシャドーイングとオーバーライドの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。