首页 >后端开发 >C++ >C#继承中的阴影和覆盖有什么区别?

C#继承中的阴影和覆盖有什么区别?

Barbara Streisand
Barbara Streisand原创
2025-01-28 14:11:39311浏览

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

C# 继承中的 Shadowing 与 Overriding 区别详解

在继承机制中,程序员会遇到两种截然不同的技术:Shadowing(隐藏)和 Overriding(重写)。理解这两者之间的细微差别对于有效运用继承至关重要。

重写 (Overriding) 发生在子类声明一个方法时,该方法与基类中定义的方法具有相同的名称、返回类型和参数列表。重写允许子类提供基类方法的自定义实现。当子类的对象调用重写的方法时,将执行子类中的代码,有效地覆盖基类方法的行为。

相比之下,隐藏 (Shadowing) 发生在子类声明一个方法时,该方法与基类中的方法具有相同的名称,但方法签名(返回类型或参数列表)不同。隐藏在子类中创建了一个新方法,它替换了基类中具有相同名称的方法。在子类的对象上调用隐藏的方法将执行子类中的代码,有效地隐藏了基类方法。

考虑以下示例:

<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>

当在 A 类和 B 类的对象上调用方法时,预期的输出如下:

<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>

关键区别在于将 B 对象转换为 A 对象时:

  • 对于隐藏的方法 (Foo),调用基类的实现。
  • 对于重写的方法 (Bar),调用子类的实现。

隐藏 (Shadowing) 如果基类方法在未考虑继承的代码中被依赖,则可能存在问题。它可能导致意外行为并使调试变得困难。另一方面,重写 (Overriding) 提供了一种受控的机制来修改方法实现,同时保持继承结构。

以上是C#继承中的阴影和覆盖有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn