zoukankan      html  css  js  c++  java
  • 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++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/luodao1991/p/3052376.html
Copyright © 2011-2022 走看看