2011-01-11 100 views
3

我有三个类。C#继承虚拟或覆盖

人 - >员工 - >经理

人宣布为

public virtual void saySomething() 

内部员工的我有

public virtual void saySomething() 

OR

public override void saySomething() 

和虚拟方法一世 获得相同的行为

内部经理的我有

public override void saySomething() 

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

如何阻止方法被重写?这是最后一种方法。

回答

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() {...} 
2

可以使用sealed关键字停止虚拟存在在继承层次结构中进一步覆盖。

您使用倍率是Employee正确的,你想覆盖Person提供的默认实现。 virtual中的Employee类型为saySomething方法不正确。

1

您必须使用sealed关键字。