zoukankan      html  css  js  c++  java
  • 实现多态的方式——虚方法

      多态的概念:让一个对象能够表现出多种的状态(类型)。

      用一句话来描述多态:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态。

      多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。让程序具有扩展性,节省成本,提高效率。

      实现多态的3种方式: 虚方法、抽象类、接口。

      1、虚方法

      将父类的方法标记为虚方法,使用关键字virtual,这个方法可以被子类重新写一遍。

      在父类的方法前面加上一个virtual,在子类的方法前面加上一个override;如果子类的方法前面不加override,编译器不会报错,但这样的话,就无法通过父类来调用子类的方法,因为这个方法成了子类的独有的方法,只是名字与父类相同而已,与父类无关。

      注意:如果需要对父类的方法进行重写的话,一定要在子类的方法面前加上overrie进行修饰。

      什么时候使用:几个类可以提取出一个共同的父类,它们都要完成相同的事情,而且这个父类可以被实例化。

        例如: 员工9点打卡,经理10点打卡,董事长11点打卡; 这几个类共同的父类是员工类,它们都要完成打卡这件事情。

        public class Employee
        {
            public virtual void DaKa()
            {
                Console.WriteLine("九点打卡");
            }
        }
    
        public class Manager : Employee
        {
            public override void DaKa()
            {
                Console.WriteLine("经理10点打卡");
            }
        }
    
        public class Chairman : Employee
        {
            public override void DaKa()
            {
                Console.WriteLine("董事长11点打卡");
            }
        }
                Employee emp = new Employee();
                Manager mg = new Manager();
                Chariman cm = new Chariman();
                Employee[] emps = { emp, mg,cm };
                for (int i = 0; i < emps.Length; i++)
                {
                    emps[i].DaKa();
                }
                Console.ReadKey();
      emps[i].DaKa(); 调用的依然是父类的方法 DaKa(),只不过该方法已经被子类重写了。具体调用哪一个子类的DaKa()方法,取决于emp[i]里面装的是哪一个的子类对象。
      上面的代码也体现了里氏转换原则,子类可以被赋值给父类。通过共同的父类,取消了各个子类之间的差异性。

     2、使用虚方法需要注意的几点:

      1)父类中如果有方法需要让子类重写,则可以将该方法标记为virtual

      2)虚方法在父类中必须有实现,哪怕是空实现

      3)虚方法子类可以重写(override),也可以不重写

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Selenium2+python自动化-使用JS脚本处理网页滚动条
    Python定时框架 Apscheduler 详解【转】
    转:VMware 15 安装 MAC OS 10.13 原版(详细图文教程)
    Appium+Robotframework实现iOS应用的自动化测试
    在jenkins打开roboframework报告:Opening Robot Framework report failed
    springcloud使用pagehelper 实现分页,及total 数据问题
    日志打印request 和response 内容
    springboot+elasticsearch + rabbitMQ实现全文检索(使用transportClient 实现CRUD)
    springboot+elasticsearch + rabbitMQ实现全文检索(springboot+ES整合)
    springboot+elasticsearch + rabbitMQ实现全文检索(项目搭建)
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/4493795.html
Copyright © 2011-2022 走看看