防止C#子类覆盖方法

假设我有一个名为“Parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。 我希望这个方法对于inheritance“Parent”的每个子类是相同的 – 如果子类试图实现他们自己的“DisplayTitle”方法,我想要编译错误。 我怎样才能在C#中实现这一目标。 我相信Java,我只是将方法标记为“最终”,但我似乎无法在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,我只是将方法标记为“最终”,但我似乎无法在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#与Java相比有多么不同,所有方法都是Java中的虚拟方法。 在C#中,您必须明确使用关键字。

派生类可以通过再次使用相同的名称来隐藏您的方法。 这可能是您正在讨论的编译警告。 使用new关键字会抑制警告。 此方法不以任何方式覆盖原始方法,基类代码始终调用原始方法,而不是派生类中的方法。

使用sealed修饰符可以防止子类覆盖您的类,属性或方法。 使用密封时什么不起作用?

http://msdn.microsoft.com/en-us/library/88c54tsw.aspx

我很确定你想要的东西在C#中使用方法修饰符关键字是不可能的。

密封仅在覆盖祖先类中的虚方法时适用,然后阻止进一步覆盖。