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("程序员不打卡");
        }
   
    }

原文地址:https://www.cnblogs.com/jefy/p/9207477.html