假设我有一个名为“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/