此文章转载网站:https://www.cnblogs.com/qixinbo/p/8244583.html

多态:

有多态之前必须要有继承,只有多个类同时继承了同一个类,才有多态这样的说法。

  在继承关系的前提下,实例化出不同的对象,这些对象调用相同的方法,但是却表现出不同的行为,这就叫做多态。

在 C#语言中体现多态有三种方式:虚方法,抽象类, 接口。

1、虚方法

1.1什么是虚方法?

在父类中使用 virtual 关键字修饰的方法, 就是虚方法。在子类中可以使用 override 关键字对该虚方法进行重写。

Virtual方法也可以单独执行。

1.2虚方法语法

父类:

public virtual 返回值类型 方法名()

{

方法体代码;

}

子类:

public override 返回值类型 方法名()

{

方法体代码;

}

1.3.虚方法使用细节

①将父类的方法标记为虚方法, 就是在父类方法的返回值前加 virtual 关键字,表示这个方法可以被子类重写。

②子类重写父类方法, 在子类的方法的返回值前加 override 关键字。

③父类中的虚方法, 子类可以重写, 也可以不重写。

④父类中用 virtual 修饰的方法, 可以用于实现该方法共有的功能(比如初始化该方法), 然后在子类重写该方法时, 使用 base 关键字调用父类中的该方法。

2、抽象方法

2.1 抽象方法

虚方法到抽象方法

父类里面用 virtual 关键字修饰的方法叫做虚方法,子类可以使用override重新该虚方法,也可以不重写。

虚方法还是有方法体的,当我们父类中的这个方法已经虚到完全无法确定方法体的时候,就可以使用另外一种形式来表现,这种形式叫抽象方法。

2.2抽象方法语法

抽象方法的返回值类型前用关键字abstract修饰,且无方法体。

public abstract void Hello();

抽象方法必须存在于抽象类中。

abstract class FuLei

在定义类的关键字class前面加abstract 修饰的类就是抽象类。

子类继承抽象类,使用 override关键字重写父类中所有的抽象方法。

2.3.3 抽象类注意事项

<1>抽象类中不一定要有抽象方法, 但是抽象方法必须存在于抽象类中。

<2>抽象类不能被实例化, 因为抽象类中有抽象方法(无方法体), 如果真能实例化抽象类的话, 调用这些无方法体的方法是没有任何意义的, 所以无法实例化。

2.3.4 使用场景

<1>当父类中的方法不知道如何去实现的时候, 可以考虑将父类写成抽象类,将方法写成抽象方法。

<2>如果父类中的方法有默认实现, 并且父类需要被实例化, 这时可以考虑将父类定义成一个普通类, 用虚方法实现多态。

<3>如果父类中的方法没有默认实现, 父类也不需要被实例化, 则可以将该类定义为抽象类。

3、接口

3.1 接口语法

抽象类到接口

当抽象类中所有的方法都是抽象方法的时候,这个时候可以把这个抽象类用另外

一种形式来表现,这种形式叫接口。

虚方法,抽象类,接口是三种实现多态的手段。

语法格式要求:

接口使用 interface 关键字定义,没有 class 关键字,接口名一般使用 “IXxxx”

(实际使用要在interface前加public ,因为我有时候为了依赖注入,直接使用接口来装载子类对象)

这种方式进行书写, 在一堆脚本中通过名字判断, I 开头的都是接口。

接口中不能包含字段,但是可以包含属性(? 没有字段,如何写属性那? ?使用自动属性 public int Age {get;set;})

(公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值。)

接口中定义的方法不能有方法体,全是抽象方法,但又不需要用 abstract 修饰;

接口中的成员不允许添加访问修饰符,默认都是 public;

(既然是接口里面的方法,当然需要从外面调用,必然是public了。)

3.2 接口注意事项

<1>接口中所有的方法都是抽象方法,所以接口不能被实例化;

<2>一个类可以实现多个接口,被实现的多个接口之间用逗号分隔开;

class Batmobile:Car,IFly

<3>一个接口可以继承多个接口, 接口之间也要用逗号分隔。

类与类之间只能单继承。

使用场景:

接口是一种能力,是一种规范,当我们对现在已经存在的类的继承关系进行功能扩展的时候,就可以使用接口来完成相应的工作。

具有特殊功能属性或者方法的子类,使用接口完成他的特殊点。

接口独立于原有的继承关系之外

3.3 多态之接口案例

3.3.1 C#属性

常规属性:先定义一个私有的字段,然后在为这个私有字段封装一个公开的属性,在属性中实现get和set两个方法,这种方式叫做常规属性。

  当我们使用常规属性的时候,可以在get和set方法中,编写逻辑代码对取值和赋值进行逻辑的校验。这种方式是我们之前一直在使用的方式。

  自动属性:在某些情况下,属性的get和set只是完成字段的取值和赋值操作,而不包含任何附加的逻辑代码,这个时候可以使用自动属性。

例如:

public int Age {get;set;}

不用写字段,直接写属性

当我们使用自动属性的时候, 就不需要再写对应的字段了, C#编译器会自动给我们的自动属性提供一个对应的字段。

注意:在接口中使用属性,就要写自动属性的格式,因为接口中不支持字段。

总结:

记牢语法格式!

使用场景对比

虚方法:父类中的个别方法用虚方法实现,然后允许子类在有需要的情况下重写这些虚方法。

virtual和override

父类中包含虚方法也可以实例化对象。

抽象类:父类定义一系列的规范,子类去把父类里面定义的这些规范全部实现。

Abstract和override

父类是抽象类,那么不能单独实例化。

接口:是一种功能的扩展,是在原有的类的继承关系以外的新功能的扩展。

C#面向对象:多态的更多相关文章

  1. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  2. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  3. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  4. 【基础】Equal方法、面向对象-多态-继承-封装

    package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...

  5. Python之面向对象多态

    Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...

  6. Java面向对象多态

    Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...

  7. C#面向对象-多态

    面向对象的三大特性(封装,继承,多态)大多少人都应该知道.前两个的话比较容易理解.本文主要说一下面向对象中的多态. 什么是多态?不同的对象对同一操作,产生不同的执行结果.这就是多态.那么多态又包含了: ...

  8. JAVA面向对象-多态的理解

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  9. OC面向对象多态笔记

    面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: int main() { //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 Anima ...

  10. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

随机推荐

  1. Unknown picture file extension

    Image1.Picture.LoadFromFile('aaa.jpg'); Project Project1.exe raised exception class EInvalidGraphic ...

  2. spring-boot-starter-security Spring Boot中集成Spring Security

    spring security是springboot支持的权限控制系统. security.basic.authorize-mode 要使用权限控制模式. security.basic.enabled ...

  3. xmlhttp的OnReadyStateChange事件

    这两天抽空升级了一下自己做的pon资料表,增加了OLT拓扑自动发现以及业务从MSE至OLT的全自动下发 等功能,让人没想到的是在处理xmlhttp回调时死活接收不到反馈信息, 在Excel论坛和微软官 ...

  4. win10 IIS 10.0 无法安装 URL Rewrite Module 重写模块

      打开注册表 win+R 输入 regidit在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp位置 修改注册表 把MajorVersion的值改为9 安装 ...

  5. Git(四):Git远程操作详解

    转: http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  6. 运动函数封装(js)

    // 运动函数 function starMove(obj,json,fnEnd){ clearInterval(obj.timer); obj.timer  = setInterval(functi ...

  7. 前向渲染路径细节 Forward Rendering Path Details

    正向渲染路径细节 Forward Rendering Path Details Forward Rendering path renders each object in one or more pa ...

  8. linux系统启动过程及运行等级详解

    一.启动过程 1. 开机流程简述 1)加载BIOS硬件信息,并获取第一个启动设备的代号 2)读取第一个启动设备的MBR的引导加载程序的启动信息 3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试 ...

  9. 花了好几个小时的奇葩Mat为0问题

    问题 1. Mat mserMat = adaptive_image_from_points(contour, rect); CCharacter character; character.setCh ...

  10. vs2012安装qt5.5.1

    https://blog.csdn.net/a6513806/article/details/80098057