虚方法(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#中的可空类型的隐式转换等。

这样大家就可以很容易的看到,虚方法是我们的程序扩展性很强,如果你想再添加一个秘书类,只要再写个类然后派生于父类,再在主程序中修改一点就行啦。而不需要去该其他的类和父类。