谈谈C#中的三个关键词new , virtual , override
[1] 谈谈C#中的三个关键词new , virtual , override
[2] 谈谈C#中的三个关键词new , virtual , override
[3] 谈谈C#中的三个关键词new , virtual , override
[2] 谈谈C#中的三个关键词new , virtual , override
[3] 谈谈C#中的三个关键词new , virtual , override
最后我们再说说关键词之间的搭配关系,上面已经给出了virtual和override不兼容的几个关键词,这里就不重复了。我要说的是new和virtual在声明函数时,其实可以一块使用。因为这个函数是新的,故与其它任何new函数一样,隐藏了具有相同原型的继承来的函数。因为这个函数也是虚拟的,所以可以在派生类中进一步复位义,这样就为这个虚拟函数建立了一个新的基级别。最后用GrandsonClass类来看看。
Code
运行结果为:
BaseClassPrint
InheritClassPrint
BaseClassPrint
可见在InheritClass中使用了new以后,就意味着它与基类的同名方法为两个不同方法了,而它又是虚拟的,所以它的子类还可以继续继承BaseClass的Print()方法。
将函数声明为virtual 与将它声明为new virtual是一样的,因为new仍然是默认的。所以下面的两句是相同的:
public new virtual void Print(); public virtual void Print();
那么new virtual的意义又在什么地方呢?在大型的层次结构中,这可能很有用,比如如下的System.Windows.Form类的继承关系Object->MarshalByRefObject->Component->Control->ScrollableControl->
ContainerControl。
很容易想象出将一个派生的窗体集合作为窗体对待,而不是作为Object的情形。
再将Program.cs修改如下:
Code
运行结果为:
BaseClassPrint
InheritClassPrint
BaseClassPrint
GrandsonClassPrint