.NET独有的精巧泛型设计模式

来源:未知 责任编辑:责任编辑 发表时间:2014-05-10 12:25 点击:

在.NET发展史中,2.0是具有里程碑意义的一个版本。从这个版本,.NET青出于蓝(Java),而胜于蓝。在.NET 2.0带来的诸多新特性中,我认为泛型是最重要,没有之一。

虽然泛型出现已有多年,连Java都早已借鉴引入了泛型(虽然是语法糖),可是用泛型的编程思维方式并没有得到相应的普及。一方面是由于过去大量的Framework仍然是在非泛型时代写成的,另一方面泛型的设计模式没有得到发展,改变的时候该到了。

来举一个例子说明这两点。我们如果写过网络数据抓取的代码,应该熟悉这样的代码:

var request = WebRequest.Create("http://www.2cto.com/") as HttpWebRequest;
 

或者这么写,也是一样:

var request = HttpWebRequest.Create("http://www.2cto.com/") as HttpWebRequest;
 

大家可想过,为什么每次都要as一下?

类似的情况还有,比如做图像处理的弟兄会熟悉:

var bm = Image.FromFile("e:\\me.jpg") as Bitmap;
 

var bm = Bitmap.FromFile("e:\\me.jpg") as Bitmap;
 

我想过,但没想明白。上面两种写法,都是调用父类的工厂方法,实际返回了一个子类的实例。显然,即使不了解OCP,凭直觉也应该想到,父类的实现中不应该被子类所决定。写WebRequest和Image的前辈可能也觉得直接返回子类实例不妥,所以阴险地把方法签名的返回类型改成了父类。

虽然这种行径值得严重鄙视。但.NET程序员大都是人云亦云,照葫芦画瓢的好学生,所以这个问题多年了也没有修改。

理想的设计应该是这样:父类的每个子类,都有独立的工厂方法,返回其自身的实例。这样做法,在泛型出现前非常笨拙,得不偿失,但有了泛型,就可以精巧地实现。

以模拟Image类为例,Image和BitMap实现如下:

class Image<T> where T:Image<T>, new()
{
    public string Path { get; set; }

    public static T FromFile(string path)
    {
        return new T() { Path = path };
    }
}

class Bitmap:Image<Bitmap>
{
}
 

Image自身的工厂方法,就没有存在的必要了。

可以简单地测试一下:

var path = @"e:\me.jpg";
var bm = Bitmap.FromFile(path); ;

Console.WriteLine(bm.Path);
Console.WriteLine(bm.GetType().Name);
 

输出结果如下:

Path: e:\me.jpg
Type: Bitmap

为了让大家更熟悉一下,再举一个实现数据结构中的二叉树作例子。

传统的树节点类,无论无论C/C++/Java都是类似这样:

class TreeNode
{
    public TreeNode LeftChild { get; set; }

    public TreeNode RightChild { get; set; }

    public TreeNode Parent { get; set; }

    public int Value { get; set; }
}
 

大家知道,二叉树又分好几种,AVL树、B树、红黑树等等。实现特殊的二叉树数据结构,势必要继承TreeNode。由于树节点的类型中,有类型为基类的成员,所以在子类操作这些成员时,往往也要强制转换类型,这比Image和WebRequest的例子,只在实例创建时转换类型还麻烦。

这就该泛型模式一显身手的好机会了,请看其父类型的实现:

/// <typeparam name="T">Type of the node.</typeparam>

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 浅析.NET下XML数据访问新机制
  • asp.net 面试+笔试题目第1/2页
  • C# 邮件地址是否合法的验证
  • C#高级编程:数据库连接[1]
  • asp.net 设置GridView的选中行的实现代码
  • 经典C++程序1
  • IIS 自动回收导致后台定时器失效的问题解决
  • ASP.NET&#160;GridView列表代码示例
  • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1