一、virtual与override
C#中支持重写(覆写)实例方法和属性,但不支持重写字段或任何静态成员。
我们使用基类引用访问派生类对象时,得到的是基类的成员(用基类来访问派生类时基类返回基类,派生类返回派生类)。当使用虚方法(virtual)时,可以得到派生类的成员和函数(当使用虚方法virtual和覆写override标记时,输出的都是派生类的成员)。
如果我们想要使用基类的引用返回派生类的对象时,可以通过虚方法来实现访问。
它必须满足如下条件:
1、派生类的方法和基类的方法有相同的签名和返回值类型。
2、基类的方法使用virtual标注。
3、派生类的方法使用override标注。
多态是面向对象编程的基本特征之一,它使得派生类(子类)的实例可以直接赋予基类(父类)的对象,然后直接通过这个对象调用派生类的方法。而在C#中,类的多态是通过在派生类中重写基类的虚方法(virtual)来实现的。
virtual关键字用于在基类中修饰方法。Virtual的使用由两种情况:
(1)、在基类中定义了virtual方法,但在派生类中没有重写(override)该方法。那么在对派生类实例的调用中,该虚方法(virtual)使用的是基类定义的方法。
(2)、在基类中定义了virtual方法,然后在派生类中使用override重写了该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。
需要注意的是:
1、覆写override和被覆写的方法必须有相同的可访问性。
2、不能覆写static方法或非虚方法。
3、方法、属性和成员类型事件都可以被声明为virtual和override。
二、new
在C#中,new关键字可用作运算符,声明修饰符,约束。
1、new运算符:new运算符穿件类型的新实例,调用构造函数(如果继承了基类,同时会调用基类的构造函数)。
2、new声明修饰符:
(1)在用作声明修饰符时,new关键字可以显式隐藏从基类继承的成员。派生类成员变量被new关键字修饰以后,只能被派生类调用。如果希望重写基类成员变量或方法,可以使用virtual或override修饰关键字。
(2)派生类如果定义了和基类同名的成员变量或方法,同样会隐藏基类的同名变量或方法,但编译器会警告。如果使用new来修饰,将不显示此警告。
(3)new约束:new约束指定泛型类或方法声明中的类型实参必须有公共的无参数构造函数。若要使用new约束,则该类型不能为抽象类型。