C#继承虚拟或覆盖

时间:2011-01-11 08:06:02

标签: c#

我有三节课。

人 - >员工 - >管理器

Person有一个声明为

的虚方法
public virtual void saySomething()

员工内部我

public virtual void saySomething()

OR

public override void saySomething()

我得到了同样的行为

经理内部我

public override void saySomething()

我对使用覆盖替换虚拟的事实感到困惑?我以为你使用override来表示这个类已经覆盖了一个基类函数。

如何阻止方法被覆盖?这是最后一种方法。

3 个答案:

答案 0 :(得分:8)

在子类中添加public virtual void saySomething()重新声明方法(方法隐藏;您可能会收到警告)。

如果您以下列方式访问它,它的行为将相同:

Employee emp = ...
emp.saySomething();

但现在添加:

Person per = emp;
per.saySomething();

使用多态(通过override),他们应该做同样的事情。但是通过方法隐藏他们不会。要显式隐藏方法,请使用new

new public virtual void saySomething() {...}

停止进一步覆盖某些内容,请使用sealed

public sealed override void saySomething() {...}

答案 1 :(得分:2)

您可以使用sealed关键字来阻止继承层次结构中的虚拟被覆盖。

您在Employee中使用覆盖是正确的,您希望覆盖 Person提供的默认实施。 <{1}}方法的virtual类型中的Employee不正确。

答案 2 :(得分:1)

您必须使用sealed关键字。