virtual:
virtual关键词修饰的方法我们一般称之为虚方法,这样我们就可以在任何派生类中重写该函数。
public virtual void virtualMethod()
{
}
同样,virtual关键词也可以修饰属性,我们称这个属性为虚属性或者叫‘重写属性’,语法与‘虚方法’的语法一样,在定义部分加上关键词virtual修饰即可。
public virtual string GetName
{
set;
get;
}
在C#中函数在默认情况下不是虚函数,但是可以显示的声明成为虚函数(构造函数除外,因为虚函数时用来体现继承中的多态性,构造函数不需要继承)。一般我们将虚函数定义在基类中,因为具体实现方法我们可能没有想清楚,可以在基类中简单实现。可以在后面的继承类中在用override(new用来重写属性)来完善其具体实现。
note:成员字段和静态函数都不能声明为virtual,这个概念只对类中的实例成员有意义。
隐藏方法:
如果基类中实现了一个方法A,但是该方法没有声明为virtual,在派生类实现了一个签名相同的方法A,那么派生类的方法就会‘隐藏’基类的方法。这种情况就造成了隐患,我们在大多数情况下时要重写方法,而不是隐藏方法。因为隐藏方法可能会导致实例调用错误。因为编译器在决定调用那个方法上会产生潜在的冲突,从而导致以外的结果。
抽象方法:
可以发现virtual方法和抽象方法abstract还是又很多相同的地方,尤其是在继承性上。
abstract public class A
{
abstract public void B();
}
如果一个类继承了一个抽象类,那么这个类必须实现抽象类中的方法。可以说abstract修饰的类和方法就是用来继承的。但是virtual修饰的方法是又方法体的。
采用那种方法更多的是看采用了什么样的设计,如果一开始这个基类就是为了规范开发,可以用abstract对其进行修饰。如果在实现某个方法时,觉得这个方法可能会在子类中被重写,那么就用virtual对其进行修饰。尽量避免采用’隐藏方法‘。