商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

令人激动的“扩展”

—— c#3.0扩展方法的实现与应用

   【IT168 技术文档】“扩展方法”是C#3.0中的一个新特性之一。他的官方解释是在实例基础上扩展现有的类型方法,说白了就是我们现在可以往现有的类中添加自己的方法,例如我们可以在System.String类中添加一个我们自己定义的Print()方法,是不是很酷呢?:)

1. 为什么我们要使用扩展方法
    也许有人会认为这是一个很愚蠢的想法,因为你完全可以在自己的类中定义一个新的方法或是使用继承来实现相同的功能。下面我们来看一看这两种方法会产生的问题:

    首先看第一种方法,我们在自己的类中定义一个新的方法去实现扩展功能。比如现在我们正在开发一套游戏程序,其中引用了一个第三方的程序包,而我们要对他的一个类Frozen Sword(冰霜之剑,这个看名字大家也知道是干嘛的吧) 进行一些扩展,比如我们需要它有自动冷却的功能,于是我们定义了AutoCooling(int seconds)方法, 当你使用它时,你会考虑使用下面两种方式中的哪一种呢?
Void UseSwordCool(ForzenSword sword)
{
//让剑在5s中冷却下来吧
Sword.AutoCooling(5);
}

Void UseSwordCool(FrozenSword sword)
{
//让剑在5s中冷却下来吧
AutoCooling(sword);
}
    很显然你会选择第一种方法来表达这种意图,因为它最符合我们思考事物的逻辑,剑的冷却是它自身的一个功能,而不是我们使用任何外力作用使它冷却。但这儿我们就会遇到一个问题,由于Frozen Sword是包含在第三方的类库中,我们无法直接去修改他的代码,使我们能以第一种形式取调用AutoCooling方法。

    这时候很多人都会想到我们使用第二种方法即使用继承来解决这个问题:
Public class MyFrozenSword : FrozenSword
{
Public void AutoCooling(int seconds) { … }
}
    当然我们在后面的程序中都要把ForzenSword改成MyFrozenSword才能正常调用。那么使用继承的方法也会有这两个问题:首先继承无法应用在sealed类型的class上,最明显的例子就是 System.String类型,由于string类型是密封类,所以我们无法对它进行继承扩展。其次使用这种方式扩展仍然不能使定义为FrozenSword类型的实例对象使用AutoCooling方法,所以它并不是一个很好的表达。
    我们写程序的目的就是为了更好的表达现实世界中的复杂逻辑,让code运行起来就和它看起来一样(The code that does what it looks like.)这是我们的设计目标。所以如果是第一种方式最能表达我们的意图,我们就应当使用它,即使它需要我们敲入更多的代码。我承认使用定义新方法或是使用继承在某些环境下确实是正确的,但大部分情况下向现有类型中添加自己的扩展方法才是最完美的解决方案。

1 2 3
©版权所有。未经许可,不得转载。
[责任编辑:铭娅]
[an error occurred while processing this directive]