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

有关扩展方法的一些知识点请参看我的前篇博客: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 函数,则不是扩展方法调用。

时间: 2024-09-21 12:02:41

C#3.0 中使用扩展方法来扩展接口的相关文章

使用扩展方法来扩展接口

 不清楚扩展方法的清先预热下 推荐:http://www.cnblogs.com/luluping/archive/2008/05/26/1207530.html 摘抄:http://www.cnblogs.com/luluping/archive/2008/05/26/1207536.html 1.扩展方法跟原来类的方法重名时候的处理逻辑 2.扩展方法的嵌套 现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口 应用场景举例: 我们有时候会发现最初定义的一个接口,在现在环境下,这个接口

MetaBuilders在ASP.NET FORUMS2.0中的应用方法

asp.net 曾听到朋友报怨ASP.NET FORUMS2.0中因为使用了MetaBuilders使得化码不太直观,呵,有利有有弊,使用这个控件目的在于统一界面. 比方说在管理页面中一般都会分成左右两栏,在ASP.NET可能比较常用的方法有两种,一种是使用框架,还有一种是使用一个表现左边的asxc来统一.那么使用了MetaBuilders之后是一种什么情况呢?我觉得和使用了框架页面差不多,不过里面没有了分栏,页面看起来是一个整体,页面变成了一个容器,包含了其他的一些分页,这种做法就要比使用as

jQuery中的$.extend方法来扩展JSON对象

$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var settings = { validate: false, limit: 5, name: "foo" }; var options = { validate: true, name: "bar" }; jQuery.extend(settings, options); 结果 set

YII2.0中分页实现方法

//在Controller中引用 use yii\data\Pagination;      //分页类 //在列表的方法中写入 $pages = new Pagination(['totalCount' =>$count, 'pageSize' => 10]); return $this->render('index',[pages' => $pages]); //在模板中写入 < ?= LinkPager::widget(['pagination' => $page

VC++6.0中使用ADO方法访问access数据库

使用ADO连接数据库是通过Connection对象的Open方法实现的,语法是: Connection.Open Connectionstring.userID.password,openoptions 参数说明: Connectionstring:(可选)字符串,包含连接信息 userID:(可选)字符串,包含连接时所使用的用户名称 password:(可选)字符串,包含建立连接时多用密码 openoptions:(可选)ConnectoptionEnum值,如果设置为adConnectoAs

C# 3.0语言新特性(语言规范):2 扩展方法

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 扩展方法(Extension Methods)是一种静态方法,可以通过实例方法的语法进行调用.从最终效果上看,扩展方法使得扩展一个现有类型和构造一个具有附加方法的类型变成了现实. 注意 扩展方法很难发觉,并且比起实例方法在功能性上有很大限制.出于这些原因,我们建议保守地使用扩展方法,仅在实例方法不大可行或根本不可行的时候才使用. 扩展成员的其他类型,如属性.事件和运算符都在考虑之中

asp.net C# 3.0 新特性 学习(二):匿名类型、扩展方法

这两天看了一下msdnwebcast上的visual studio 2008的系列课程,记录下所学的知识,以便加深记忆 1.匿名类型 顾名思义 匿名类型就是没有名字的类型.在C#3.0中允许我们在程序中声明一个临时的类型来存储数据,例如:    代码如下 复制代码 class Program      {          static void Main(string[] args)          {              //声明一个匿名对象,拥有 Name和Age 属性      

教你在IronPython中使用C#扩展方法

在现在的开发过程中为了减少单个文件的代码量,降低协同开发时文件被独占锁定的几率,我们经常会使用扩展方法.扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 随着DLR的广泛使用,面临越来越多需要C#代码和脚本语言交互的需求.(如果你知道如何使用,建议去DLR的官方网站去看看)但是,对于扩展方法来说如果直接使用会有发现DLR无法查找到指定的方法.

Jquery中扩展方法extend使用技巧_jquery

在使用Jquery开发的过程中,extend是常用的参数处理函数,特别是对默认值的使用. Jquery的扩展方法原型是: var v=$.extend(dest,src1,src2,[,src3...]); 作用是把src1,src2,src3合并到到dest中并返回合并后的dest. 但是在使用过程中,默认值往往是不能被改变的, 如下: var defaut={'selector':'select','default':'默认值','backcolor':'#85e137','forecolo