多态是同一个行为具有多个不同表现形式或形态的能力。而且多态是为了扩展而生!它可以通过继承实现、也可以通过接口实现,多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
使用继承:
- 父类类型作为方法返回值类型(实际上返回的是一个具体的子类对象)
- 父类类型作为方法参数类型(实际传递的是具体的子类对象)
使用接口:
- 接口作为方法返回值类型(实际上返回是一个接口实现类对象)
- 接口类型作为方法参数类型(实际上传递的是一个接口实现类对象)
一、为什么要用接口?
接口:就是一个标准,一个规范。USB接口为例它有4根线(1根是电源5v、一个是地线、一个是接收、一个是发送),这个标准或者规范一旦确定是不会更改的。应用:我们可以按照这个规范,去生成需要的设备接口。
A:当我们开发一个软件的时候,可能很多时候,我们设计完一个对象后,并不需要马上考虑,或者我们也可能不知道这个对象具体怎么样去编写,我们只是知道的这个对象的行为(也就是知道他干什么,但是不知道怎么干)还
有一种情况,当我们做团队开发的时候,比如一个项目设计了10个模块,由10个小组完成。怎么做到各自做各自的呢?基于以上的问题,我们可以使用接口解决。
- 第一、我们设计对象后,可以根据行为直接设计接口(接口就是只有方法规定,没有具体实现)
- 第二、我们可以把相关的模块都抽象成接口,然后接口直接相互协作,最后不同开发组实现不同的模块,这些模块开发完毕后,项目也就自动集成了。
二、接口怎么使用?
通过实例测试。实例模拟:我们想设计一个人作为父类、然后有校长、教师….
思考:就是说校长和教师的共同行为,能不能都放到父类中?比如,校长和教师的演讲、讲课等这些行为,不见得非得放到人这个父类中,因为这些并不是人的共同特征。
父类:人类
校长:-->人类
教师:-->人类
教务:人类
后勤:人类
思考:如果我们把校长、教师这些演讲、讲课的行为都放到人类中,当我们设计教务、后勤人员类的时候,这些行为会自动延续给他们,这样是不合理的!因此我们始终要注意,父类一般只放共同的行为,对于部分子类的行为,不能全部放到父类中,因为后面扩展的时候,这些会自动的延续给子类,所以,我们可以把这部分抽象为接口。然后呢?谁具有这样的行为,谁实现接口。进行统一的关联。也就是说接口侧重于行为的规范、继承侧重于复用!
- 接口规定:必须以 I 开头,接口的方法都是没有实现的方法,方法不需要写public。
- 接口可以抽象方法,也可以抽象属性。关键字:interface
- 接口具有强制性,也就是一个类实现一个接口,就必须把接口的所有方法都实现!并且不能改变方法的签名
三、接口和抽象类的区别
1.接口侧重的是功能的封装,抽象类侧重的是代码的复用,虽然两者都可以实现多态,但是我们在扩展中,如果没有要继承的内容时,请直接使用接口。即使有要继承的内容,通常把公共内容放到父类中,然后需要多态的行为,放到接口中。
2.接口更简洁,使用更方便。在框架设计中,抽象的都会变成接口,而不是使用抽象类。
多态的基本原则依据:里氏替换原则。
四、系统接口的使用
接口分类:
【1】自定义接口,根据我们实际的项目开发需求,自己写接口。
【2】系统接口,也就是.NET平台已经封装好的,可以给我们直接使用的接口。
常见的系统接口:IList 当我们讲List的时候,有一个对象比较的接口?ICompare
五、接口在设计模式中的应用(重点学习)(待补充)
作者:晨岩
本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!