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