接口可以认为是属于不同继承树的代码之间的行为约定。C#的接口相当于是一种特殊的抽象类,这种抽象类的内部只有虚方法。

一 接口的使用

a) 接口内部可以包含方法、属性、索引器和事件,这些成员都不在接口中实现。接口内部的成员默认都是公开的,而且如果用public修饰还会报编译错误。

b) C#不支持多继承,但可以实现多个接口。

c) 有时会遇到这样的需求:要继承某个接口,但又不想公开接口相关的方法。这时可以使用Name Hiding特性。比如有IDataBound接口

对接口方法的实现除了一般的public void Bind()形式外,还可以这样

把public修饰符去掉,然后写成void IDataBound.Bind()

二 重名问题

C#不支持多继承的原因之一是为了避免重名问题。但因为接口的存在,仍然会有重名的情况出现。比如ISerializable和IDataStore都约定了SaveData方法。

如果一个类同时实现了这两个接口,要如何区分两个Save方法呢,做法与之前的Name Hiding类似

可以在方法前面加上接口类型

三 继承与接口带来的问题

a) 基类的方法与接口的方法同名

本来EditBox类要继承IDataBound接口就必须实现Serialize方法,但这种情况不去实现竟然也能编译通过。因为基类的Serialize方法把编译器欺骗了。

b) 派生类的方法与基类继承的接口的方法同名

比如有接口和方法ITest.Foo(),然后基类实现了ITest接口

上面代码的执行结果会是:

调用哪个Foo()方法取决于当前所持有的引用,调用myDrived.Foo()时,持有MyDerived对象的引用;当转换为ITest接口后,编译test.Foo()时,编译器会上溯继承树,直到找到实现了ITest接口的类。

为了避开这些坑,在使用接口时最好具有明确的转换。

四 接口的合并

有时如果需要同时实现多个接口,就可以将这些接口合并为一个,感觉这就是接口的继承。合并后的接口会带有之前接口的所有成员,还可以添加新的成员。

《Inside C#》笔记(八) 接口的更多相关文章

  1. 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...

  2. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  3. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  4. Elasticsearch笔记八之脑裂

    Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...

  5. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  6. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  7. 笔记-python-redis接口

    笔记-python-redis接口 1.      python 与redis接口 redis是redis数据库的python接口包,为python提供的redis的调用接口. 注:文档内容主要基于h ...

  8. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  9. DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER

    原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...

随机推荐

  1. kill 结束进程

    kill 支持的信号 kill -1 重启进程 kill -9 终止进程 pkill 和 killall 的区别在于pkill 可以踢终端用户 pkill  -9  -t tty1

  2. 机器学习技法笔记:16 Finale

    Roadmap Feature Exploitation Techniques Error Optimization Techniques Overfitting Elimination Techni ...

  3. HoloLens开发手记-硬件细节 Hardware Detail

    微软HoloLens是世界第一款完全无线缆的全息计算机.通过在新方式上赋予用户的全息体验,HoloLens重新定义了个人计算(Personal Computing).为了将3D全息图形固定到你周围的真 ...

  4. docker学习篇(一) ----入门篇

    什么是docker docker自2013年诞生以来已有5年了,最初基于Google公司的go语言实现的,项目代码在GitHub上进行维护. 项目地址:https://github.com/moby/ ...

  5. [P4318] 完全平方数

    想不出什么办法能直接算的(别跟我提分块打表),不如二分答案吧:设\(f(x)=\sum_{i=1}^n [i不是"完全平方数"]\), 显然f(x)与x正相关.再结合筛法.容斥,不 ...

  6. HDU 6022---MG loves set(K-D树)

    题目链接 Problem Description MG is an intelligent boy. One day he was challenged by the famous master ca ...

  7. Asp.Net Core微信服务中间件-.NetCore2.1

    又封周末,闲暇无聊,随手写了一个关于微信公众号服务的中间件,基于.NetCore2.1.服务类库采用.Net Standard2.0,兼容.net 4.6.1. 整体思路是,设计一个中间件,提供微信消 ...

  8. Hadoop服务库与事件库的使用及其工作流程

    Hadoop服务库与事件库的使用及其工作流程   Hadoop服务库: YARN采用了基于服务的对象管理模型,主要特点有: 被服务化的对象分4个状态:NOTINITED,INITED,STARTED, ...

  9. 高手速成android开源项目【View篇】

    主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialo ...

  10. Oracle 基本知识回顾

    1.查找数据库所用的字符集编码:SELECT USERENV('language') FROM DUAL;2.将一个表中的字段,插入到这个表:INSERT INTO TABLE SELECT * FR ...