在继承机制中,程序员会遇到两种截然不同的技术: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 对象时:
隐藏 (Shadowing) 如果基类方法在未考虑继承的代码中被依赖,则可能存在问题。它可能导致意外行为并使调试变得困难。另一方面,重写 (Overriding) 提供了一种受控的机制来修改方法实现,同时保持继承结构。
以上是C#继承中的阴影和覆盖有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!