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#学习笔记-第十三章-定义接口、继承接口相关推荐

  1. 代码大全学习笔记——第十三章不常见的数据类型2

    13.3 全局数据 大多数有经验的程序员已经得出结论:使用全局数据的风险比使用局部数据大 与全局数据有关的常见问题 无意间修改了全局数据 与全局数据有关的奇异的和令人激动的别名问题:这是vb程序的一个 ...

  2. Windows保护模式学习笔记(十三)—— PWTPCD

    Windows保护模式学习笔记(十三)-- PWT&PCD 要点回顾 CPU缓存 CPU缓存与TLB的区别 PWT(Page Write Through) PCD(Page Cache Dis ...

  3. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  4. 获取编译学习笔记 (十三)—— 外部中断

    疯狂暑期学习  汇编入门学习笔记 (十三)--  外中断 參考: <汇编语言> 王爽 第15章 1.外中断信息 外中断分为可屏蔽中断和不可屏蔽中断 可屏蔽中断 先看看内中断所引发的中断过程 ...

  5. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  6. PMBOK(第六版) 学习笔记 ——《第一章 引论》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  7. CCSP-防火墙学习笔记第6章

    CCSP-防火墙学习笔记第6章-Netemu首发 第6章刚刚完成,排版上更具层次化,等第7章完结后,将会重新把1-7章的内容编好目录.作为Cisco防火墙学习笔记的初级篇发布 高级特性将会在第8章讨论 ...

  8. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  9. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

最新文章

  1. 第三届福建省大学生智能车竞赛
  2. linux shell 语句出错自动退出 调试 检查 脚本
  3. 爬取音乐排行_TapTap排行榜数据大盘点
  4. Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
  5. 用 Python 在朋友圈中游遍全球
  6. .NET Core 2.1.5和.NET Core SDK 2.1.403发布
  7. 7年老Android一次操蛋的面试经历,讲的太透彻了
  8. PostgreSql 分页limit
  9. 2018-11-30
  10. 13个不错的jquery图片放大器效果
  11. 使用postman测试post类型请求
  12. vb远程访问dde服务器,做wincc与VB的dde连接一定要用ddeserver吗?
  13. 《文明3》全攻略之设置篇
  14. API集成测试问题2:Expected status code 200 but received 500. Failed asserting that false is true.
  15. Linux---wifi驱动移植及调试(SSV6x5x)
  16. 全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程
  17. SAP PP生产计划体系
  18. 好用的数据恢复软件,误删不再怕
  19. SpringBoot jap使用原生Sql的几种姿势
  20. html仿微信公众号底部菜单代码,模仿微信公众号底部导航菜单

热门文章

  1. Oracle中procedure和function创建举例
  2. 学生信息管理系统中遇到的问题解析
  3. DELPHI设置枚举类型size
  4. Android 5.1 API 22 所有sdk文件下载地址
  5. doubango简介
  6. springmvc 中文文档
  7. koa --- nunjucks
  8. javascript --- 数组实用小技巧
  9. es6 --- 使用生成器交替执行
  10. 廖雪峰老师Git教程代码梳理