假设我有一个名为“Parent”的抽象父类,它实现了一个名为“DisplayTitle”的方法。我希望这个方法对于继承“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”。我目前收到警告 - 但似乎这是我应该做的事情,而且我不知道标记方法的正确属性。
答案 0 :(得分:10)
我如何在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.
我建议你把警告变成错误,然后更难忽略它们:)
答案 1 :(得分:2)
派生类不能覆盖您的方法,您没有声明它虚拟。请注意,与Java相比,C#中的情况有很大不同,所有方法都是Java中的虚拟方法。在C#中,您必须明确使用关键字。
派生类可以再次使用相同的名称隐藏您的方法。这可能是您正在讨论的编译警告。使用 new 关键字会抑制警告。此方法不以任何方式覆盖原始方法,基类代码始终调用原始方法,而不是派生类中的方法。
答案 2 :(得分:1)
使用sealed修饰符可以防止子类覆盖您的类,属性或方法。使用密封时什么不起作用?
答案 3 :(得分:0)
我很确定在C#中使用方法修饰符关键字无法实现所需。
密封仅在覆盖祖先类中的虚方法时适用,然后阻止进一步覆盖。