网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C#应用
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.在CS类文件里向调用页面输出Java.
.Visual C#2005中使用正则表达式.
.在C#中利用SharpZipLib进行文件的.
.Visual c#的Excle编程.
.教你用C#开发智能手机软件:推箱.
.用C#开发智能手机软件:推箱子(二.
.C#中如何读写INI文件.
.在C#中使用热键隐含窗口.
.C#正统的MYSQL的SQL文本替换规则.
.C# GridView 排序及分页.
.c-sharp开发应避免的几个小滥用.
.在Linux中使用C#.
.在dotnet下用c#编写下载器.
.从小处看C#.net垃圾回收.
.C#将DateTable表数据导出到Excel.
.用C#实现生成PDF文档(附源码).
.js也可以有自定义事件 注入就是这.
.C#下提取汉字首字的拼音首字母并.
.接触C#的服务器端正则表达式相关.
.使用Web服务将C#代码转换为VB.NE.

C#3.0 中使用扩展方法来扩展接口

发表日期:2007-6-7


前篇博客中我重点介绍了两个特殊场景:

1、扩展方法跟原来类的方法重名时候的处理逻辑

2、扩展方法的嵌套

现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口

 

应用场景举例:

我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数。有了扩展方法后,我们在这种情况下又多了一种实现的选择。下面以代码来说明这个问题:

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }

}

 

调用方法:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.ReadLine();
}

 

分析这样做的好处:

1、如果我们实现 MyInterface 接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方。减少代码量。如果实现这个接口的类被封装在不同的组件中,一些组件由于其他原因难以修改,这时候用扩展方法来扩展接口真是给我们一剂良药呀;

2、扩展方法被调用到,前提条件是扩展方法所在的命名空间被使用了。我们如果把接口跟扩展方法放到同一个命名空间,扩展方法需要引用命名空间的问题就可以认为不存在了。因为你要用这个接口,必然会引用这个命名空间。

3、扩展方法扩展的接口,与你自己实现这个接口的类中自己实现的函数重名时候的问题(这时候也可以简单认为是这个类 override 了这个函数实现)。

先说结论:这两个不存在冲突问题,你如果是接口调用,则是扩展方法,如果是实现类调用,则是实现类自己的方法,参看我前面博客对扩展方法跟原来类的方法重名时候的处理逻辑的描述,下面再以一段代码来描述这个问题。

namespace Hongjun.Guo
{
    interface MyInterface
    {
        void Test01();
    }

    static class MyExtensionMethods
    {
        public static void MyTest002(this MyInterface ii)
        {
            ii.Test01();
        }

    }
    public class MyClass : MyInterface
    {
        public void Test01()
        {
            Console.WriteLine("Test01");
        }

        public void MyTest002()
        {
            Console.WriteLine("MyTest002");
        }
    }
}


调用代码:

using Hongjun.Guo;

static void Main(string[] args)
{
    MyInterface mm = new MyClass();
    mm.MyTest002();
    Console.WriteLine("***********");
    ((MyClass)mm).MyTest002();

    Console.ReadLine();
}

这段代码执行的结果是
Test01
***********
MyTest002

分析:

mm.MyTest002(); 这行代码是接口调用,则使用的是扩展方法。

((MyClass)mm).MyTest002();  这行代码调用者类型是MyClass ,MyClass  实现了MyTest002 函数,则不是扩展方法调用。

上一篇:C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers) 人气:3955
下一篇:C#3.0 中的扩展方法 (Extension Methods) 人气:4371
浏览全部C#3.0的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐