类和接口的实现

   接口定义:为一组方法签名指定一个名称的方式。

   类实现接口,就一定要提供接口所有方法的实现。

   即使抽象类,也要全部实现,但是,它可以把接口方法声明为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# 接口代码实例的更多相关文章

  1. php接口数据加密、解密、验证签名代码实例

    php接口数据加密.解密.验证签名 代码非常easy,这里就不多废话了,直接奉上代码 <?php /** * 数据加密.解密.验证签名 * @edit http://www.lai18.com ...

  2. LAPACK的C/C++接口及代码实例

    今天介绍一个矩阵处理工具LAPACK,她有C\C++接口,可在windows下移植.本人最近正在学习,发现还是还不错滴~ 本博文分为三部分,第一部分介绍LAPACK的安装,这里只介绍最简单的部署:第二 ...

  3. php 登录注册api接口代码

    /** *一览(www.yl1001.com) * PHP开发API接口 服务端 */ require 'conn.php'; //连接数据库的文件 header('Content-Type:text ...

  4. 转载:Java的接口及实例

    转自:http://blog.csdn.net/liujun13579/article/details/7736116/ 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特 ...

  5. CodeIgniter 开发,支付宝接口调用实例

    准备:1.alipay官方下载最新接口类库2.解压后,将目录"\即时到账交易接口-create_direct_pay_by_user\demo\create_direct_pay_by_us ...

  6. web service上传参数代码实例

    web service上传参数代码实例 这次做的项目用到webservice比较多,最开始在网上看的参考dome,发现都不行,后来发现安卓4.0以后有很大的不同,在做传参时,有些东西需要注意: 第一, ...

  7. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  8. 转:十九、Java的接口及实例

    http://blog.csdn.net/liujun13579/article/details/7736116 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合 ...

  9. Java认证:JavaRunnable线程编写接口代码

    Java认证:JavaRunnable线程编写接口代码.JavaRunnable线程如何才能更好的适应目前的编程环境呢?下面我们就看看如何才能更好的进行相关环境.希望下面的文章对大家有所帮助.Java ...

随机推荐

  1. continuous integration and continuous deployment in DW/BI

    deployment methodIn Redshift1, Deploy process: Drop and Refresh the view, Drop table, Create an empt ...

  2. angular ng-class使用笔记

    在前面Angularjs开发一些经验总结中说到在angular开发中angular controller never 包含DOM元素(html/css),在controller需要一个简单的POJO( ...

  3. 改写URL的查询字符串QUERY_STRING(转)

    查询字符串是指URL请求中“问号”后面的部分.比如,http://www.nowamagic.net/?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar. 1. 利用QSA转换查 ...

  4. innode 节点

    [root@localhost soft]# ls -i tt1 tt2 xx.c [root@localhost soft]# stat tt1 File: `tt1' Size: 4096 Blo ...

  5. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

    为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统.众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的 成熟,越来越多的系统开始转型为 ...

  6. 2015 UESTC Training for Search Algorithm & String - J - 全都是秋实大哥 【KMP】

    给出一个字符串,求每个前缀的最小循环节长度,并输出整个字符串的最小循环节.字符串长度为3*10^6 找循环节这种问题还是要用KMP对于长度为i的字符串 i%(i-f[i])==0 此时,它的最小循环节 ...

  7. Codeforces 540D Bad Luck Island - 概率+记忆化搜索

    [题意] 一个岛上有三种生物A,B,C,各有多少只在输入中会告诉你,每种最多100只 A与B碰面,A会吃掉B, B与C碰面,B会吃掉C, C与A碰面,C会吃掉A...忍不住想吐槽这种环形食物链 碰面是 ...

  8. Mediator 中介者 协调者模式

    简介 定义:用一个[中介者对象]封装一系列的[对象交互],中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介者模式的结构 抽象中介者Mediator:定义好[ ...

  9. 怎么在后台修改前台html页面的key、title、description

    public void UpdateMeta(string title, string keyword, string desc) { ; i >= ; i--) { if (this.Head ...

  10. UWP app HelloWorld 的创建

    步骤 1:在 Visual Studio 中创建新项目 启动 Visual Studio 2015 RC.将出现 Visual Studio 2015 RC 起始页. (从现在开始,我们将 Visua ...