Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5632
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 61
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-27 14:01
文章分类
文章存档

2014年(1)

2013年(3)

我的朋友
最近访客

分类: C#/.net

2013-11-27 14:06:55

  NewContainer类型定义了一个占位符,但是占位符的类型是当做黑盒引用来使用的。之所以称之为黑盒,是因为用户并不知道并且也不关心盒子里会装什么。对于NewContainer类型,因为它并没有调用占位符的任何方法,也没有使用它的任何数据成员,所以占位符是一个黑盒。如果NewContainer类型企图调用一个方法或者使用数据成员,编译时会报告错误。这是因为NewContainer类型并不知道其中支持什么方法或数据成员。

  下面是如何约束NewContainer类型的一个例子:

  class BaseType< mytype> {
  public virtual void DoSomething( mytype value){class NewContainerConstrained< item> : NewContainer< item> where item : BaseType< item> { public void ActionMethod( item param) { param.DoSomething( MyProperty);

  这个示例代码看起来也许有些令人迷惑,因为同一个类型在执行多个不同的动作。NewContainerConstrained类型继承自NewContainer类型。因为NewContainer类型是一个泛型类,因此要定义占位符,也就正好是NewContainerConstrained的占位标识符。也可以为父类型NewContaIner中的占位符指定一个明确的类型,如下所示:

  class NewContainerConstrained< item> : NewContainer< int>

  回到那个约束的示例代码,跟在where条目后面的标识符指明了约束。跟在where关键字后面的第一个标识符必须是一个占位标识符。占位标识符后面的冒号指明了该占位标识符继承的类型。附加的类型标识符new()说明占位符类型必须支持无参数的构造函数。

  一旦约束了占位符,就可以调用其所支持的方法了。在这个例子中,意味着占位符item必须继承自BaseType类型,而BaseType也是个泛型。BaseType类型有一个方法,这个方法可以在他NewContainerConstrained类型的环境中被调用。因为所有的泛型类型都使用相同的占位符,所以当泛型特例化的时候就不存在类型转换的问题。

  现在让我们回到过早特例化泛型的问题。过早特例化带来的问题是它过早地约束了泛型代码。假设NewContaIner的子类巳经被特例化为Int类型,则param.DoSometh1ng方法调用也要被特例化。原因是对BaseType的DoSomething方法的约束是定义为一个占位符。下面是使用一个特例化的形式修改的泛型代码:

  class BaseType {
  public virtual void DoSomething( int value){
  class NewContainerConstrained< item> : NewContainer< int> where item : BaseType { public void Method( item param) { param.DoSomething( MyProperty);

  修改后的NewConta1nerConstra1ned类型特例化了 NewContaIner类型,而BaseType类型不是一个泛型。结果导致不能使用BaseType类型来处理其他类型。在很多情况下这是可以接受的,但是它的确阐述了一个重要的泛型代码的事实。当编写代码时,对泛型的使用要么是完全的泛型,要么特例化。这意味着你的类对于泛型部分要么都包含占位符,要么这些泛型部分都使用已经特例化的定义。部分的特例化会带来问题,因为当约束没有完成的时候就会产生错误。

  编写泛型代码时意味着你的类型应编写成可重用代码。当在特例化的环境中编写代码时,意味着是在编写模块。如果你试图使一部分代码是泛型的而另一部分是特例化的,这是很闲难的,需要做很多工作。本书利用了大量.NET泛型,因为它们总是可以很漂亮地解决很多问题。
  推荐更多知识:
阅读(396) | 评论(0) | 转发(0) |
1

上一篇:没有了

下一篇:.net使用Factory模式实例化类型

给主人留下些什么吧!~~