多态的概念
首先解释下什么叫多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用“相同”的方法,产生的结果是不同的。这里的“相同”打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。
1、虚方法
1.1、概念
虚方法:即为基类中定义的允许在派生类中重写的方法,使用virtual关键字定义。如:
public virtual void EatFood()
{
Console.WriteLine(“Animal吃东西”);
}
注意:虚方法也可以被直接调用。如:
Animal a = new Animal();
a.EatFood();
2、抽象方法
2.1 例题1
编程实现:猫和狗都会叫,但是猫是喵猫的叫,狗是汪汪的叫
namespace 多态
{
class Program
{
static void Main(string[] args)
{
Animal a = new Cat();
a.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("狗汪汪的叫");
}
}
}
2.2、抽象方法与虚方法的对比
如果父类需要被实例化,而且父类中的方法有实际意义就使用虚方法
如果父类不需要被实例化,而且父类中的方法没有实际意义就用抽象方法
2.3、抽象方法的特点
1.抽象成员必须标记为abstract,并且不能有任何实现。
2.抽象成员必须在抽象类中。
3.抽象类不能被实例化
4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。
(除非子类也是一个抽象类,则可以不重写)
5.抽象成员的访问修饰符不能是private
6.在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现
7.抽象类是有构造函数的。虽然不能被实例化。
8、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。