c# - 防止 C# 子类覆盖方法

标签 c# object inheritance

假设我有一个名为“Parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。我希望这个方法对于继承“Parent”的每个子类都是相同的——如果子类试图实现他们自己的“DisplayTitle”方法,我希望出现编译错误。我如何在 C# 中完成此操作。我相信 Java,我只是将方法标记为“final”,但我似乎无法在 C# 中找到替代方法。我一直在摆弄“密封”和“覆盖”,但我无法获得我正在寻找的行为。

例如,在这段代码中:

using System;

namespace ConsoleApplication1
{
  class Parent
  {
      public void DisplayTitle() { Console.WriteLine("Parent's Title"); }
  }

  class ChildSubclass : Parent
  {
      public void DisplayTitle() { Console.WriteLine("Child's Own Implementation of Title"); 
  }

    static void Main(string[] args)
    {
        ChildSubclass myChild = new ChildSubclass();
        myChild.DisplayTitle();
        Console.ReadLine();
    }
  }
}

我想收到一个编译错误,指出“ChildSubClass”无法覆盖“DisplayTitle”。我目前收到警告 - 但似乎这是我应该能够做的事情,但我不知道标记该方法的正确属性。

最佳答案

How can I accomplish this in C#. I believe in Java, I'd just mark the method as "final", but I can't seem to find an alternative in C#.

C# 中的粗略等效项是 sealed,但您通常只需要它用于虚拟方法 - 而您的 DisplayTitle 方法不是虚拟的。

重要的是要注意 ChildSubclass 不是覆盖 DisplayTitle - 它隐藏它。任何仅使用对 Parent 的引用的代码都不会最终调用该实现。

请注意,按原样使用代码,您应该会收到一个编译时警告,建议您将 new 修饰符添加到 ChildSubclass 中的方法:

public new void DisplayTitle() { ... }

你不能阻止派生类隐藏现有的方法,除了通过密封类本身来完全阻止派生类的创建......但是不使用派生类的调用者直接输入不会在意。

真正关心的是什么?意外误用,还是蓄意问题?

编辑:请注意,您的示例代码的警告类似于:

Test.cs(12,19): warning CS0108:
        'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
        member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
        if hiding was intended.

我建议你把警告变成错误,这样就更难忽略它们了:)

关于c# - 防止 C# 子类覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12732533/

相关文章:

c# - 读写硬盘有多少个线程?

javascript - 难以理解 JavaScript 中的基本对象工作原理

c++ - 使用继承规避 switch 语句

c++:继承和模板性能权衡

C++继承维度计算器程序错误: "function call missing argument list"

c# - 我应该使用 isDbNull 吗?在这种特殊情况下如何使用它?

c# - 自定义 DataGridView 单元格绘画

c#:将新项目添加到组合框

object - 有没有一种方法可以将Map()对象传递给不同屏幕中的不同状态小部件?

c# - 为什么我不能将对象(实际上是 object[])转换为 string[]?