virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这不影响父类方法的功能。为了达到子类以自己的方法实现某一功能的目的,需要在父类中用virtual关键字来修饰方法,这样,在其继承子类中就可以采用覆盖的方法来提供方法的多态机制。virtual关键字在类中修饰方法需要注意以下几点:
1. virtual修饰类中方法时,前面必须有public修饰符,非虚方法不能是有;
2. virtual不可以与static、abstract、private、override一起使用;但virtual和override密不可分,要在子类中覆盖基类的虚方法,就必须要用到override覆盖,以子类方法实现某一功能;
3. virtual修饰的方法必须有实现,即使该实现是一个空方法体;
4. 基类中的virtual方法可以选择在继承子类中覆盖或不覆盖,这样就存在两种情况:
(1)若基类中定义的virtual方法在派生类中被覆盖(override),那么在对派生类实例的调用中,该方法使用的是派生类中的新方法(该新方法是在子类中通过覆盖父类中的虚方法而重新定义的方法);
(2)若在基类中定义的virtual方法在派生类中没有被覆盖(override),那么在对派生类实例的调用中,该方法使用的是基类中定义的方法。
5. 如果基类中的方法准备在派生类中覆盖(override),那么基类中的该方法必须要用virtual修饰。
abstract(抽象)方法在逻辑上类似于virtual(虚)方法,只是它不能像虚方法那样被调用,它只是一个接口的声明而非实现。在定义abstract(抽象)类和方法时需要注意以下几点:
1. abstract(抽象)方法没有类似于{……}这样的方法实现,也不许允许这样做;
2. 含有abstract(抽象)方法的类一定要是abstract(抽象)类,同时一定要加abstract修饰符;只有抽象类才能有抽象方法;另外,抽象类只能作为基类(父类)使用;
3. 抽象方法在基类中没有具体实现,但必须要在子类中覆盖(override)并实现该方法;并且抽象方法在实现后不能更改修饰符。
4. 如果子类没有实现抽象父类中所有的抽象方法,则子类也必须定义成一个抽象类。