IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> .NET新手区 -> c# 接口代码实例 -> 正文阅读

[.NET新手区]c# 接口代码实例

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的集合基于接口,因为各种集合间极少共享的代码。
上一篇文章      下一篇文章      查看所有文章
加:2015-03-29 20:35:22  更:2017-05-14 05:11:02 
 
  .NET新手区 最新文章
将ZIP文件添加到程序集资源文件然后在运行时
Web服务的调用
.NET创建WebService服务简单的例子
多线程编程学习笔记——任务并行库(三)
序列化和反序列化
Spring学习之路
多线程(2)Thread
五小步让VS Code支持AngularJS智能提示
Log4net入门(SQL篇)
C#十五子游戏
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 新闻资讯 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年11日历
2018-11-20 2:26:18
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库