CLR via C#学习笔记-第十三章-定义接口、继承接口
13.1 类和接口继承
接口是为了实现多继承
所有的类都继承了System.Object,及其四个公共实例方法:ToString、Equals、GetHashCode、GetType。
CLR允许定义接口,它实际只是对一组方法签名进行了统一命名。这些方法不提供任何实现。
类通过指定接口名称来继承接口,而且必须显式实现接口方法,否则CLR认为此类型定义无效。
实现接口方法的过程比较繁琐,所以说接口继承是实现多继承的一种缩水版机制。
编译器和CLR允许一个类继承多个接口,继承的所有接口都必须实现。
接口继承特点
类继承的一个重要特点是,凡是能使用基类型实例的地方,都能使用派生类型的实例。
类似的,凡是能够使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例。
13.2 定义接口
接口还能定义事件、无参属性和有参属性。
所有这些东西的本质上都是方法,他们只是语法上的简化。
不过接口不能定义任何构造器方法,也不能定义任何实例字段。
接口不能定义静态成员
CLR允许接口定义静态方法、字段、常量和构造器,但符合CLS标准的接口决不允许,C#禁止接口定义任何一种静态成员。
接口定义就是类型定义
在CLR看来,接口定义就是类型定义。
也就是说CLR会为接口类型对象定义内部数据结构,同时可通过反射机制来查询接口类型的功能。
和类型一样,接口可在文件范围中定义,也可嵌套在另一个类型中。定义接口类型时可指定你希望的任何可见性、可访问性。
接口继承不是严格的继承
接口定义可以从另一个或多个接口继承。但它不是严格的继承。
接口继承的工作方式并不完全和类继承一样。
作者倾向于将接口结成看成是将其他接口的协定contract包括到2新接口中。
例如ICollection<T>接口定义包含了IEnumerable<T>和IEnumerable两个接口的协定,有下面两层含义:
1.继承ICollection<T>接口的任何类必须实现ICollection<T>、IEnumerable<T>和IEnumerable三个接口所定义的方法。
2.任何代码在引用实现ICollection<T>接口的对象时,该类型还实现了IEnumerable<T>和IEnumerable接口。
13.3 继承接口
显式为实现接口的方法标记virtual和隐式的区别
编译器要求将实现接口的方法标记为public。
CLR要求将接口方法标记为virtual,编译器会将他们标记为virtual和sealed。这会阻止派生类重写接口方法。
将方法显式标记为virtual,编译器就会将该方法标记为virtual并保持它的非密封状态,使派生类能重写它。
派生类重写基类实现的接口方法
派生类不能重写sealed的接口方法,但派生类可重新继承同一个接口,并为接口方法提供自己的实现。
下例对此进行了演示:
//派生自Object,他实现了IDisposable internal class Base:IDisposable{public void Dispose(){Console.WriteLine("Base's Dispose");} } //重新实现了IDisposable internal class Derived:Base,IDisposable{new public void Dispose(){Console.WriteLine("Base's Dispose");} }
在Main函数中进行调用:
/*****************第一个例子****************/ Base b=new Base(); //用b的类型调用Dispose,显示"Base's Dispose" b.Dispose(); //用b的对象的类型调用Dispose,显示"Base's Dispose" ((IDisposable)b).Dispose();/*****************第二个例子****************/ Derived d=new Derived(); //用d的类型调用Dispose,显示"Derived's Dispose" d.Dispose(); //用d的对象的类型调用Dispose,显示"Derived's Dispose" ((IDisposable)d).Dispose();/*****************第三个例子****************/ b=new Derived(); //用b的类型调用Dispose,显示"Base's Dispose" b.Dispose(); //用b的对象的类型调用Dispose,显示"Derived's Dispose" ((IDisposable)b).Dispose();
转载于:https://www.cnblogs.com/errornull/p/9905469.html
CLR via C#学习笔记-第十三章-定义接口、继承接口相关推荐
- 代码大全学习笔记——第十三章不常见的数据类型2
13.3 全局数据 大多数有经验的程序员已经得出结论:使用全局数据的风险比使用局部数据大 与全局数据有关的常见问题 无意间修改了全局数据 与全局数据有关的奇异的和令人激动的别名问题:这是vb程序的一个 ...
- Windows保护模式学习笔记(十三)—— PWTPCD
Windows保护模式学习笔记(十三)-- PWT&PCD 要点回顾 CPU缓存 CPU缓存与TLB的区别 PWT(Page Write Through) PCD(Page Cache Dis ...
- 《Go语言圣经》学习笔记 第三章 基础数据类型
<Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...
- 获取编译学习笔记 (十三)—— 外部中断
疯狂暑期学习 汇编入门学习笔记 (十三)-- 外中断 參考: <汇编语言> 王爽 第15章 1.外中断信息 外中断分为可屏蔽中断和不可屏蔽中断 可屏蔽中断 先看看内中断所引发的中断过程 ...
- Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍
开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...
- PMBOK(第六版) 学习笔记 ——《第一章 引论》
系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...
- CCSP-防火墙学习笔记第6章
CCSP-防火墙学习笔记第6章-Netemu首发 第6章刚刚完成,排版上更具层次化,等第7章完结后,将会重新把1-7章的内容编好目录.作为Cisco防火墙学习笔记的初级篇发布 高级特性将会在第8章讨论 ...
- 《Java编程思想》读书笔记 第十三章 字符串
<Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...
- Programming Entity Framework-dbContext 学习笔记第五章
### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...
最新文章
- 第三届福建省大学生智能车竞赛
- linux shell 语句出错自动退出 调试 检查 脚本
- 爬取音乐排行_TapTap排行榜数据大盘点
- Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
- 用 Python 在朋友圈中游遍全球
- .NET Core 2.1.5和.NET Core SDK 2.1.403发布
- 7年老Android一次操蛋的面试经历,讲的太透彻了
- PostgreSql 分页limit
- 2018-11-30
- 13个不错的jquery图片放大器效果
- 使用postman测试post类型请求
- vb远程访问dde服务器,做wincc与VB的dde连接一定要用ddeserver吗?
- 《文明3》全攻略之设置篇
- API集成测试问题2:Expected status code 200 but received 500. Failed asserting that false is true.
- Linux---wifi驱动移植及调试(SSV6x5x)
- 全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程
- SAP PP生产计划体系
- 好用的数据恢复软件,误删不再怕
- SpringBoot jap使用原生Sql的几种姿势
- html仿微信公众号底部菜单代码,模仿微信公众号底部导航菜单