c# 接口代码实例
类和接口的实现
接口定义:为一组方法签名指定一个名称的方式。
类实现接口,就一定要提供接口所有方法的实现。
即使抽象类,也要全部实现,但是,它可以把接口方法声明为abstract的,从而把这个接口方法留给派生类去实现,如下:
public interface ITest
{
void Test();
}
public abstract class AbstractClass : ITest
{
public abstract void Test();
}
public class ConcreateClass : AbstractClass
{
public override void Test()
{
//Coding implementation;
}
}
14.2 定义接口
接口中可以有方法/事件/属性,因为后者本质上也是 方法
接口中不可以有静态成员(包括常量/枚举)
接口之间可以"继承",可以认为是包含另一种接口的约定,并不是真正意义的继承
接口下所有成员,默认为public,不用声明
14.3 实现接口
实现的接口方法,一定要标记为public,此时在IL中为virtual和sealed,即不允许子类重写该方法(这时new也不管用了)。
要显示将调用的接口方法标记为virtual,则可以在子类中重写该方法
//如果显示标记为sealed,那么就更不可以重写了
14.4 调用接口方法
在运行时,可以将一个变量从一种接口类型转型为另一种接口类型,只要该对象的类型实现了这两种接口,如下:
//String实现了Icloneable, IEnumerable
String s = "Jax";
ICloneable cloneable = s;
IEnumerable enumable = (IEnumerable)cloneable;
注:cloneable只可使用ICloneable的接口方法,不可以使用String的方法;enumable变量虽由ICloneable转型而来,但也不能使用ICloneable接口方法。
值类型也可以实现接口,但是在转成接口类型前要先装箱——接口变量必须是指向堆上的一个对象的引用。
//Int32实现了IFormattable接口
Int32 i = 0;
//i在转成接口类型前要先装箱
IFormattable formattable = (IFormattable)i;
14.5 接口方法的隐式/显示实现
接口方法一般都是隐式实现的,可访问性一定要声明为public。
EIMI:显示接口方法实现,用定义方法的那个接口的名称来作为方法名称的前缀。
不属于类型对象的一部分,只是将一个接口连接到类型上,同时避免了暴露行为和方法
不能指定可访问性public/private——在IL中标记为为private,只有通过接口变量才能访问该方法,以防止类型对象直接访问。
不能标记为virtual,不能被重写。
public interface ITest
{
void Test();
}
public class TestClass : ITest
{
public void Test()
{
Console.WriteLine("1");
}
void ITest.Test()
{
Console.WriteLine("2");
}
} TestClass t = new TestClass();
t.Test(); //输出1
ITest it = (ITest)t;
it.Test(); //输出2
14.6 泛型接口
3个好处
1.编译时的类型安全性
Int32 x = 1;
String s = "1";
IComparable c = x;
c.CompareTo(x);
c.CompareTo(s); //运行期错误,因为Object是不安全类型
IComparable<Int32> cc = x; //强类型,所以直接受整型x,不接受字符串s,否则编译期报错
2.操作值类型时减少装箱
上个例子将x传到Compare方法要装箱,使用泛型不用装箱,按值传递。
非泛型现在仍存在于FCL,是为了向后兼容。
3.同一个类可以实现同一个泛型接口若干次,只要使用不同类型参数
public sealed class Number : IComparable<Int32>, IComparable<String>
{
public int CompareTo(int other) { }
public int CompareTo(string other) { }
}
可以把IComparable<Int32>和IComparable<String>看作两个不同的接口,就好理解了。
14.7 泛型接口的参数约束
2个好处:
1.可以将类型参数约束为多个接口,从而使传入的参数类型必须实现所有接口约束
2.减少装箱
参数约束,会生成特定的IL语言,使得直接在值类型上调用接口方法,而不用装箱。
14.9 用EIMI改进编译时类型安全
使用EIMI技术,处理非泛型接口,保证类型安全
struct SomeValueType : IComparable
{
private Int32 m_x;
public SomeValueType(Int32 x)
{
m_x = x;
}
//这是一个类型安全的方法
public Int32 CompareTo(SomeValueType other)
{
return m_x - other.m_x;
}
//这是一个类型不安全的方法,但是一定要有,才能保证编译通过,因为参数不同,可以认为是重载,而且这个方法才是接口方法的实现
Int32 IComparable.CompareTo(Object other)
{
return CompareTo((SomeValueType)other);
}
}
调用的时候要注意:
SomeValueType v = new SomeValueType();
Object o = new Object();
Int32 n = v.CompareTo(v); //类对象v的Comapre方法,保证类型安全
IComparable c = v;
n = c.CompareTo(v);
n = c.CompareTo(o); //接口对象c的Comapre方法,不能保证类型安全,所以不要使用接口对象
14.10 EIMI的缺点
3个缺点:
1.没有说明具体如何实现一个EIMI方法
2.值类型实例在转换为接口类型时,会被装箱
3.EIMI方法不能被派生类型继承
14.11 接口与类继承
类继承: 表示 IS-A。易于使用,不必提供所有实现;可以override和new重写;易于在基类中添加成员,而不需改动子类
接口: 表示 CAN-DO。以上类继承的优点一概没有。
值类型继承自System.ValueType,只能使用接口
FCL的集合基于接口,因为各种集合间极少共享的代码。
c# 接口代码实例的更多相关文章
- php接口数据加密、解密、验证签名代码实例
php接口数据加密.解密.验证签名 代码非常easy,这里就不多废话了,直接奉上代码 <?php /** * 数据加密.解密.验证签名 * @edit http://www.lai18.com ...
- LAPACK的C/C++接口及代码实例
今天介绍一个矩阵处理工具LAPACK,她有C\C++接口,可在windows下移植.本人最近正在学习,发现还是还不错滴~ 本博文分为三部分,第一部分介绍LAPACK的安装,这里只介绍最简单的部署:第二 ...
- php 登录注册api接口代码
/** *一览(www.yl1001.com) * PHP开发API接口 服务端 */ require 'conn.php'; //连接数据库的文件 header('Content-Type:text ...
- 转载:Java的接口及实例
转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...
- CodeIgniter 开发,支付宝接口调用实例
准备:1.alipay官方下载最新接口类库2.解压后,将目录"\即时到账交易接口-create_direct_pay_by_user\demo\create_direct_pay_by_us ...
- web service上传参数代码实例
web service上传参数代码实例 这次做的项目用到webservice比较多,最开始在网上看的参考dome,发现都不行,后来发现安卓4.0以后有很大的不同,在做传参时,有些东西需要注意: 第一, ...
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...
- 转:十九、Java的接口及实例
http://blog.csdn.net/liujun13579/article/details/7736116 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合 ...
- Java认证:JavaRunnable线程编写接口代码
Java认证:JavaRunnable线程编写接口代码.JavaRunnable线程如何才能更好的适应目前的编程环境呢?下面我们就看看如何才能更好的进行相关环境.希望下面的文章对大家有所帮助.Java ...
随机推荐
- 实现一个servlet的helloworld小程序(不适用Eclipse)
实现一个servlet的helloworld小程序(不适用Eclipse) 1. 在tomcat中的webapps下建一个应用程序FirstServlet(C:\tomcat\webapps\Firs ...
- 优化exp/imp导入导出速度大全
.exp 个相关的参数:DIRECT和RECORDLENGTH参数. DIRECT参数定义了导出是使用直接路径方式(DIRECT=Y),还是常规路径方式(DIRECT=N).常规路径导出使用SQL ...
- 排序算法 Java实现版
8种排序之间的关系: 1. 直接插入排序 (1)基本思想: 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序 ...
- 约瑟夫问题(Josephus Problem)的两种快速递归算法
博文链接:http://haoyuanliu.github.io/2016/04/18/Josephus/ 对,我是来骗访问量的!O(∩_∩)O~~ 约瑟夫问题(Josephus Problem)也称 ...
- 动态规划晋级——POJ 3254 Corn Fields【状压DP】
转载请注明出处:http://blog.csdn.net/a1dark 分析:刚开始学状压DP比较困难.多看看就发现其实也没有想象中那么难.这道题由于列数较小.所以将行压缩成二进制来看.首先处理第一行 ...
- U盘启动安装CentOS 6.3
无光驱U盘启动安装CentOS 6.3的一些必要条件: 1.主板要支持U盘启动 2.8G的U盘 3.UltraISO软件 http://www.linuxidc.com/Linux/2010-03/2 ...
- 文件标准IO的mode
1. r / r+ 是不创建文件,前者只读,后者可读写 2. w / w+ 是能创建文件,并且把文件置空,前者只写,后者可读写 3. a / a+ 是能创建文件,但不置空文件,在文件末尾写,前者只写, ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- NPOI从数据库中导出数据到Excel
首先要添加NPOI.dll程序集 https://yunpan.cn/cMeSTELJSXmJJ 访问密码 8d83 把里面的程序集都添加到引用里 下面的代码是从数据库导出到Excel { //pa ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...