《Inside C#》笔记(八) 接口
接口可以认为是属于不同继承树的代码之间的行为约定。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#》笔记(八) 接口的更多相关文章
- 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Elasticsearch笔记八之脑裂
Elasticsearch笔记八之脑裂 概述: 一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息. 而脑 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- 笔记-python-redis接口
笔记-python-redis接口 1. python 与redis接口 redis是redis数据库的python接口包,为python提供的redis的调用接口. 注:文档内容主要基于h ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...
随机推荐
- 从小白到使用antd+react+react-router+issue+es6搭建博客
概述 本身是前端小白,学过html,css,js的各种书,各种视屏,就是没有接触web开发的内容.偶然看见一个朋友用react搭建了一个博客,于是本着程序员无所不能的精神,也尝试着用react搭建博客 ...
- HttpClient实现HTTP文件通用下载类
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache. ...
- Jmeter HTTP请求后响应数据显示乱码解决方法
Jmeter请求后结果树里无论是text还是html响应数据显示乱码,这是因为jmeter 编码格式配置文件默认不开启导致的,解决方法如下: 1)进入jmeter-***\bin目录下,找到jmete ...
- 第二篇:服务消费者(RestTemplate+ribbon)
第一篇讲了服务的注册,这篇来说说服务的调用,服务与服务的通讯是基于http restful,springcloud的服务调用是通过ribbon方式的,客户端的负载均衡. Talk is cheap.S ...
- python实现线性排序算法-计数排序
计数排序假定输入元素的每一个都是介于0到k之间的整数,此处K为某个整数,当k=O(n)时,计数排序的运行时间为O(n) 它的基本思想是:根据每个输入元素x确定小于x的元素个数,根据这个信息把x直接放到 ...
- python绘图工具matplotlib在linux下安装和使用
工具介绍:matplotlib 是Python编程语言的一个绘图库及其数值数学扩展 NumPy.它为利用通用的图形用户界面工具包, 如Tkinter, wxPython, Qt或GTK+向应用程序嵌入 ...
- Linux - 变量的查看与设置
printenv - print all or part of environment 显示所有变量:print 显示某个变量:print <variable name> 或者 echo ...
- Python又把GUI界面攻下了,今天就告诉你怎么玩
0.引言 学Python这么久了,一直想做个界面出来,最近发现Python有个内置库tkinter,利用它可以很轻松做出一些简易的UI界面,首先来看Python官方对Tkinter的说明: The t ...
- 使用Charles抓取APP之HTTPS请求
Charles是一款非常好用的抓包工具,通常使用它来进行APP开发抓包调试,尤其是HTTPS请求. 一.安装Charles 去官网(https://www.charlesproxy.com/)下载软件 ...
- PetaPoco在ASP.NET Core 2.2中使用注入方式访问数据库
.Net Core中一个特别重要的特性就是依赖注入功能,那么我们在使用PetaPoco的时候是否也可以使用依赖注入特性呢? 回答当然是可以的啦.使用方法(两种注入方式)如下 services.AddS ...