但是大多数都仅仅是知道这些是什么

时间:2022-05-09 03:06:11

       相信大家都劈面向东西的三个特征封装、担任、多态很熟悉,每小我私家都能说上一两句,但是大大都都仅仅是知道这些是什么,不知道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(); } }

 

        注意:抽象要领只能在抽象类中界说,如果不在抽象类中界说,则会报出如下错误:     

            

但是大多数都仅仅是知道这些是什么

但是大多数都仅仅是知道这些是什么