首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 上传下载
c#3.0 中使用扩展方法来扩展接口_c#应用
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 

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

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 函数,则不是扩展方法调用。


文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·JasperReport经验谈-JSP教程,Java技巧及代码
·使用C#编写一个计时器-.NET教程,C#语言
·(ADODB.Command)对象的用法,用CASE调用的REM/DEL/UPDATE/-ASP教程,ASP基础
·ASP.NET的include的用法-.NET教程,Asp.Net开发
·在ASP.NET中动态修改文件下载-.NET教程,Asp.Net开发
·感受新版poco的魅力 poco2005使用心得
·p2p音乐软件的佼佼者—酷狗kugoo
·移动通信电源设备的运行和维护
·PS拼图效果滤镜Puzzle Pro-网页设计,Photoshop
·Java 调用存储过程-JSP教程,Java技巧及代码
最新文章
·bt狂必看 bitcomet使用技巧六则_上传下载教程
·根据网页html结构选择最合适的xhtml标签_html教程
·如何把迅雷设置为默认的下载工具_上传下载教程
·如何设置显示、隐藏迅雷下载的悬浮窗_上传下载教程
·迅雷被设为默认下载工具 如何取消?_上传下载教程
·.net3.5和vs2008中的asp.net ajax_asp.net技巧
·避免迅雷桌面新闻打扰_上传下载教程
·迅雷中如何导入未完成的任务继续下载_上传下载教程
·作恶的最高境界—运营商强插广告_网赚技巧
·超站大赛32强王景琳:业内没有竞争对手_站长访谈
相关主题
  • c#3.0 中 dlinq 从数据库获得数据集,xlinq从xml文件获得数据集的方法_c#应用
  • c#3.0 中对象初始化器(object initializers)和集合初始化器(collection initializers) _c#应用
  • c#3.0 linq 查询语法_c#应用
  • c#3.0 中的扩展方法 (extension methods)_c#应用
  • c#3.0 中对象初始化器(object initializers)和集合初始化器(collection initializers)_c#应用
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭