不清楚扩展方法的清先预热下
推荐:http://www.cnblogs.com/luluping/archive/2008/05/26/1207530.html
摘抄:http://www.cnblogs.com/luluping/archive/2008/05/26/1207536.html
1、扩展方法跟原来类的方法重名时候的处理逻辑 2、扩展方法的嵌套 现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口 应用场景举例: 我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数。有了扩展方法后,我们在这种情况下又多了一种实现的选择。
。。。。。。 分析这样做的好处: 1、假如我们实现 MyInterface 接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方。减少代码量。假如实现这个接口的类被封装在不同的组件中,一些组件由于其他原因难以修改,这时候用扩展方法来扩展接口真是给我们一剂良药呀; 2、扩展方法被调用到,前提条件是扩展方法所在的命名空间被使用了。我们假如把接口跟扩展方法放到同一个命名空间,扩展方法需要引用命名空间的问题就能够认为不存在了。因为您要用这个接口,必然会引用这个命名空间。 3、扩展方法扩展的接口,和您自己实现这个接口的类中自己实现的函数重名时候的问题(这时候也能够简单认为是这个类 override 了这个函数实现)。 先说结论:这两个不存在冲突问题,您假如是接口调用,则是扩展方法,假如是实现类调用,则是实现类自己的方法
1.类
/// <summary> /// 接口 /// </summary> public interface IEatClass { bool hasEat(); } /// <summary> /// 实现类 /// </summary> public class EatClass : IEatClass { public bool hasEat() { return false; } } /// <summary> /// 扩展类 /// </summary> public static class EatClassExtensions { public static bool hasEat(this IEatClass eat, int i) { if (i > 0) return true; return false; } }
2.调用
EatClass eat = new EatClass(); var res = eat.hasEat();//输出FALSE var res1 = eat.hasEat(1);//输出TRUE
3.如果扩展方法在不同的命名空间下
代码:
namespace Company.Business.Ext { /// <summary> /// 扩展类 /// </summary> public static class EatClassExtensions { public static bool hasEat(this IEatClass eat, int i) { if (i > 0) return true; return false; } } }
调用时候加上新命名空间即可
using Company.Business.Ext;
===================================
在不同的命名空间下这个破问题,折腾了一早上,基础太差了,继续干活。。。