zoukankan      html  css  js  c++  java
  • c#多态实现的方式

    1.多态概念:让一个对象能够表现出多种状态(类型)
    实现多态的条件:类必须具有继承。

    2.实现多态的三种方法: 1)虚方法  2)抽象类 3)接口
    步骤:1)在父类的返回类型前加virtual ,表示成虚方法
    2)在子类的返回类型前加override,表示将父类的方法重新写一遍。

    per[i].sayhello();//per[i]调用的是父类的方法,因为在子类中将其方法重写,故根据per[i]代表的是哪个子类对象,就表现出哪个子类的方法。
    2).抽象类
    当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。

    抽象类用abstract修饰,抽象方法在返回类型加abstract修饰。且抽象方法没有方法体。

    抽象类和接口是不允许创建自身对象的。
    static void Main(string[] args)
            {
                //用多态实现毛会叫,狗会叫

                //因为猫和狗不能产生继承关系,故需要申明抽象方法,和抽象类
                //Animal a = new Animal();//抽象类不能创建对象
                Animal animal = new Cat();//将子类对象赋给父类
                animal.bark();
                Animal ani = new Dog();
                ani.bark();
                Console.ReadKey();

            }
        }
        //定义抽象类
        public abstract class Animal
        {
            public abstract void bark();
        }

        public class Cat:Animal
        {
            public override void bark()
            {
                Console.WriteLine("猫,喵喵");
            }
        }

        public class Dog : Animal
        {
            public override void bark()
            {
                Console.WriteLine("狗,汪汪");
            }
       
        }


    1.抽象成员必须标记为abstract,并且不能有任何实现。
    2,抽象成员必须在抽象类中。
    3.抽象类不能被实例化(静态类也不能实例化)
    4.子类继承抽象类后,必须把父类中的所有抽象成员重写。(除非子类以为一个抽象类,则可以不重写)

    5.抽象成员的访问修饰符不能是private。
    因为抽象成员只能被子类对象访问,故抽象成员用private修饰则不能被访问

    6.在抽象类中可以包含实例成员,并且抽象类的实例成员可以不被子类实现。
    7.抽象类是有构造函数,虽然不能被实例化
    8.如果父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候,也必须要传入返回值。
    9.抽象类中可以定义虚方法,抽象类中的虚方法用来实现其他方面的多态。

    如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以将父类定义成一个普通类,如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类、。

    2实例
     #region//经理11点打卡  员工9点打卡  程序员不打卡
                employee em = new employee();
                Manager ma = new Manager();
                cxyuan cx = new cxyuan();
                employee[] emplo = new employee[] {em , ma , cx };

                for (int i = 0; i < emplo.Length; i++)
                {
                    emplo[i].Daka();
                }
                #endregion

    public class employee
        {

            public virtual void Daka()
            {
                Console.WriteLine("员工9点打卡");
            }
        }


        public class Manager :employee
        {
            public override void Daka()
            {
                Console.WriteLine("经理11点打卡");
            }
       
        }

        public class cxyuan:employee
        {
            public override void Daka()
            {
                Console.WriteLine("程序员不打卡");
            }
       
        }

  • 相关阅读:
    彻底清除Linux centos minerd木马 实战  跟redis的设置有关
    linux 弹出光驱失败
    teamviewer "TeamViewer Daemon is not running
    linux 如何查找io的进程
    网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2?
    查看openssl的版本
    https单向认证和双向认证
    pem转换成der
    locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory
    mysql 有报错  ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
  • 原文地址:https://www.cnblogs.com/jefy/p/9207477.html
Copyright © 2011-2022 走看看