C#3.0 中使用扩展方法来扩展接口
来源:互联网 发布:java内存泄漏分析工具 编辑:程序博客网 时间:2024/05/12 15:29
有关扩展方法的一些知识点请参看我的前篇博客:C#3.0 中的扩展方法 (Extension Methods)
前篇博客中我重点介绍了两个特殊场景:
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 中使用扩展方法来扩展接口
- C#3.0 中使用扩展方法来扩展接口
- C#3.0 中使用扩展方法来扩展接口
- C#3.0 中使用扩展方法来扩展接口
- C#3.0 中使用扩展方法来扩展接口
- C# 3.0 扩展方法&接口
- C#中扩展类和扩展方法的使用
- 在C#中使用扩展方法
- C#3.0 扩展方法
- C# 3.0 扩展方法
- C#3.0扩展方法
- c#扩展方法的使用
- 扩展方法 C# 灵活使用
- C# 扩展方法的使用
- C# .net2.0中使用扩展方法和lambda表达式
- C#3.0之扩展方法
- 扩展方法(C# 3.0 语言)
- C#3.0 扩展方法实践
- C#3.0 中对象初始化器(Object Initializers)和集合初始化器(Collection Initializers)
- Silverlight - Web应用的一道强光
- 性能测试常见误区
- 常用Java面试题
- Three TFS cool things: a tool for TFS Integration with Project and two TFS guides铪
- C#3.0 中使用扩展方法来扩展接口
- MS CRM Customization - 在CRM Web中添加按钮及集成扩展程序
- 開始來玩 jBPM
- Tips - Web UI 资源索引
- 替代 SWT GridData 更简单有效的方法
- How to create a read-only user in TFS source control
- 安全漏洞和安全软件开发讲座
- BPM introduction
- C#3.0 中的扩展方法 (Extension Methods)