手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

c#3.0 中使用扩展方法来扩展接口_c#应用

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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

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.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!