假设我有一个名为“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# 中找到替代方法。
大致相当于sealed
在 C# 中,但您通常只需要它用于虚拟方法 - 并且您的DisplayTitle
方法不是虚拟的。
重要的是要注意ChildSubclass
isn't压倒性的DisplayTitle
- it's hiding它。任何仅使用引用的代码Parent
最终不会调用该实现。
请注意,按原样使用代码,您应该会收到编译时警告,建议您添加new
方法的修饰符ChildSubclass
:
public new void DisplayTitle() { ... }
你不能stop派生类隐藏现有方法,而不是通过密封类本身以完全阻止创建派生类......但不直接使用派生类型的调用者不会关心。
你的是什么real关心这里吗?意外误用,还是故意的问题?
编辑:请注意,示例代码的警告类似于:
Test.cs(12,19): warning CS0108:
'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
if hiding was intended.
我建议您将警告变成错误,然后就很难忽略它们了:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)