虚方法(virtual)
virtual关键字用于修饰方法,属性,索引器,事件的声明,并且允许在派生类中重写这些对象。
virtual主要是用于实现多态,父类中定义虚方法,子类继承父类,并重写虚方法以实现对同一个方法不同的相应。
下面来举个例子说明
首先我定义了一个父类:Employee
class Employee { private string _name; public Employee(string name) { this._name = name; } public virtual void startWork() { Console.Write(this._name+"开始工作"); } }
注意:父类中的方法startWork在public之后加了一个关键字 virtual,该关键字表示startWork为一个虚方法
接着我们来定义第一个派生类:Manager,该类继承于Employee
class Manager : Employee { //构造函数继承于基类构造函数 public Manager(string name) : base(name) { } //重写父类方法 public override void startWork() { base.startWork();//调用基类方法 Console.WriteLine("发布任务"); } }
注意:派生类Manager的构造函数继承了父类的构造函数,同时startWork也在Manager类中被重写,使用override关键字。一般而言,virtual与override是一对的哥们。
同样的我们可以定义第二个子类,第三个子类,均派生于父类Employee
//第二个子类Seller class Seller : Employee { public Seller(string name) : base(name) { } public override void startWork() { base.startWork(); Console.WriteLine("销售产品"); } } //第三个子类Accountant class Accountant : Employee { public Accountant(string name) : base(name) { } public override void startWork() { base.startWork(); Console.WriteLine("管理财务"); } }
接着我们在Main函数来使用这些类
static void Main(string[] args) { Employee[] employees = new Employee[3];//定义了三个Employee数组 employees[0] = new Manager("张三");//数据类型的隐式转换 employees[1] = new Seller("李四"); employees[2] = new Accountant("王五"); Console.WriteLine("现在开始工作"); foreach (Employee emp in employees) { emp.startWork(); } Console.ReadKey(); }
该函数中,我们声明了一个Employee类的数组,并实现了类的隐式转换。注意,只有子类能够隐式转换为父类,而父类不能隐式转换为子类。就好比,人是一个父类,中国人是子类,中国人可以默认为人,但是人不能默认为中国人,因为人还可能是美国人,韩国人,英国人等。类似的例子还有C#中的可空类型的隐式转换等。
这样大家就可以很容易的看到,虚方法是我们的程序扩展性很强,如果你想再添加一个秘书类,只要再写个类然后派生于父类,再在主程序中修改一点就行啦。而不需要去该其他的类和父类。