防止C#子类覆盖方法
收藏

假设我有一个名为“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”。我现在得到了一个警告-但似乎这是我应该能够做的事情,我不知道适当的属性来标记方法。


最佳答案:

我怎么能用C_来完成这个任务。我相信Java,我只是把这个方法标记为“final”,但在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.

我建议你把警告变成错误,然后很难忽视它们:)

    公众号
    关注公众号订阅更多技术干货!