相信大家都劈面向东西的三个特征封装、担任、多态很熟悉,每小我私家都能说上一两句,但是大大都都仅仅是知道这些是什么,不知道CLR内部是如何实现的,所以本篇文章主要说说多态性中的一些观点已经内部实现的机理。
一、多态的观点
首先解释下什么叫多态:同一操纵感化于差此外东西,可以有差此外解释,孕育产生差此外执行功效,这就是多态性。换句话说,实际上就是同一个类型的实例挪用“不异”的要领,孕育产生的功效是差此外。这里的“不异”打上双引号是因为这里的不异的要领仅仅是看上去不异的要领,实际上它们挪用的要领是差此外。
说到多态,我们不能免俗的提到下面几个观点:重载、重写、虚要领、抽象要领以及隐藏要领。下面就来一一介绍他们的观点。
1、重载(overload):在同一个感化域(一般指一个类)的两个或多个要领函数名不异,参数列表差此外要领叫做重载,它们有三个特点(俗称两必需一可以):
要领名必需不异
参数列表必需不不异
返回值类型可以不不异
如:
public void Sleep() { Console.WriteLine("Animal睡觉"); } public int Sleep(int time) { Console.WriteLine("Animal{0}点睡觉", time); return time; } 2、重写(override):子类中为满足本身的需要来反复界说某个要领的差别实现,需要用override关键字,被重写的要领必需是虚要领,用的是virtual关键字。它的特点是(三个不异):
不异的要领名
不异的参数列表
不异的返回值。
如:父类中的界说:
public virtual void EatFood() { Console.WriteLine("Animal吃对象"); }
子类中的界说:
public override void EatFood() { Console.WriteLine("Cat吃对象"); //base.EatFood(); }
tips:经常有童鞋问重载和重写的区别,而且网络上把这两个的区别作为C#做常考的面试题之一。实际上这两个观点完全没有关系,仅仅都带有一个“重”字。他们没有在一起对照的意义,仅仅辨别它们差此外界说就好了。
3、虚要领:即为基类中界说的允许在派生类中重写的要领,使用virtual关键字界说。如:
public virtual void EatFood() { Console.WriteLine("Animal吃对象"); }
注意:虚要领也可以被直接挪用。如:
Animal a = new Animal(); a.EatFood();
运行功效:
4、抽象要领:在基类中界说的并且必需在派生类中重写的要领,使用abstract关键字界说。如:
public abstract class Biology { public abstract void Live(); } public class Animal : Biology { public override void Live() { Console.WriteLine("Animal重写的抽象要领"); //throw new NotImplementedException(); } }
注意:抽象要领只能在抽象类中界说,如果不在抽象类中界说,则会报出如下错误: