C#基础之虚方法

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

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

 

你可能感兴趣的:(C#)