use*_*817 6 c# inheritance object
假设我有一个名为"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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想收到一个编译错误,说"ChildSubClass"不能覆盖"DisplayTitle".我目前得到一个警告 - 但似乎这是我应该能做的事情,我不知道标记方法的正确属性.
Jon*_*eet 10
我怎样才能在C#中实现这一目标.我相信Java,我只是将该方法标记为"最终",但我似乎无法在C#中找到替代方案.
粗略的等价物是sealed
在C#中,但通常只需要虚拟方法 - 而且你的DisplayTitle
方法不是虚拟的.
重要的是要注意这ChildSubclass
不是重写DisplayTitle
- 它隐藏了它.任何仅使用引用的代码Parent
都不会最终调用该实现.
请注意,使用代码按原样,您应该收到编译时警告,建议您将new
修改器添加到方法中ChildSubclass
:
public new void DisplayTitle() { ... }
Run Code Online (Sandbox Code Playgroud)
您不能阻止派生类隐藏现有方法,除了通过密封类本身以防止完全创建派生类...但是不直接使用派生类型的调用者将无关紧要.
你真正担心的是什么?意外误用或故意问题?
编辑:请注意,示例代码的警告类似于:
Test.cs(12,19): warning CS0108:
'ConsoleApplication1.ChildSubclass.DisplayTitle()' hides inherited
member 'ConsoleApplication1.Parent.DisplayTitle()'. Use the new keyword
if hiding was intended.
Run Code Online (Sandbox Code Playgroud)
我建议你把警告变成错误,然后更难忽略它们:)