返回顶部
首页 > 资讯 > 精选 >如何分析.NET独有精巧泛型设计模式
  • 220
分享到

如何分析.NET独有精巧泛型设计模式

2023-06-17 10:06:03 220人浏览 泡泡鱼
摘要

如何分析.net独有精巧泛型设计模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。虽然泛型出现已有多年,连Java都早已借鉴引入了泛型(虽然是语法糖),可是用泛

如何分析.net独有精巧泛型设计模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

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

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

var request = WEBRequest.Create("Http://www.cnblogs.com/") as HttpWebRequest;

或者这么写,也是一样:

var request = HttpWebRequest.Create("http://www.cnblogs.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>  /// <typeparam name="K">Type of the node value.</typeparam>  class TreeNode<T,K> where T:TreeNode<T,K> where K: IComparable<K>  {      public T LeftChild { get; set; }      public T RightChild { get; set; }      public T Parent { get; set; }      public K Value { get; set; }  }

之后,实现任何一种特殊二叉树结构,比如RBTreeNode代表红黑树节点,可以这样:

class RBTreeNode : TreeNode<RBTreeNode,Int32>  {      /// <summary>      /// 树节点颜色,是否为红。      /// </summary>      public bool IsRed { get; set; }       public override string ToString()      {          return this.Value + "," + (this.IsRed ? "R" : "B");      }  }

这个是AVL树:

class AvlTreeNode : TreeNode<AvlTreeNode,Int32>  {      /// <summary>      /// 节点的平衡度      /// </summary>      public int Balance { get; set; }       public override string ToString()      {          return "Balance: " + Balance + ", Value: " + this.Value;      }  }

不但完全符合OCP原则,而且再也不需要as来强制转换节点类型了。

这肯定不是我的首创,其实.NET Framework中已经不少这样的设计,比如IComparable<T>接口。也有不少优秀的框架采用了类似的设计,比如大石头同学的ORM框架NewLife.XCode。

看上去也很简单吧,但是很多人思维还停留在面向对象语言刚诞生的阶段,还不习惯用这种设计模式。我认为这种写法足够典型和通用,足以得上一种设计模式,而且是.NET特殊优势,独特魅力。

说到设计模式,其实GoF提出的23种设计模式多年了,已经过时,出现了许多新模式(比如并发编程方面,参考Wiki Design Pattern)。旧有的模式中,有的已经包含在.NET语言特性中,有的模式实现方式已经改头换面。尤其在泛型出现后,许多模式的实现可以变得简洁许多,优雅许多。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何分析.NET独有精巧泛型设计模式

本文链接: https://lsjlt.com/news/288391.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何分析.NET独有精巧泛型设计模式
    如何分析.NET独有精巧泛型设计模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。虽然泛型出现已有多年,连Java都早已借鉴引入了泛型(虽然是语法糖),可是用泛...
    99+
    2023-06-17
  • 如何理解.NET MVVM设计模式
    如何理解.NET MVVM设计模式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MVVM 模式能够帮你把你程序的业务与展现逻辑从用户界面干净地分离开。保持程序逻辑与界面分离能够...
    99+
    2023-06-17
  • Java设计模式之行为型模式的示例分析
    这篇文章主要介绍Java设计模式之行为型模式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、行为型模式行为型模式关注点在于"如何运行对象/类";行为型模式用来描述程序在运行时复杂的流程...
    99+
    2023-06-15
  • 如何分析java的23种设计模式
    这篇文章主要为大家分析了如何分析java的23种设计模式的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何分析java的23种设计模式”的知识吧。FACTO...
    99+
    2023-06-03
  • js设计模式之结构型享元模式的示例分析
    小编给大家分享一下js设计模式之结构型享元模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!运用共享技术有效地支持大量...
    99+
    2024-04-02
  • C#如何解析适配器设计模式
    这篇文章将为大家详细讲解有关C#如何解析适配器设计模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。今天看到一个园子里的朋友写了一篇ASP.NET的适配器设计模式的文章。其中提到了把输入的电...
    99+
    2023-06-17
  • JS继承、工厂构造及原型设计模式实例分析
    这篇文章主要介绍“JS继承、工厂构造及原型设计模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS继承、工厂构造及原型设计模式实例分析”文章能帮助大家解决问题。正文正是由于:原型链继承和构...
    99+
    2023-07-02
  • 如何在Couchbase中进行有效的数据模型设计
    在Couchbase中进行有效的数据模型设计是非常重要的,以下是一些指导原则: 考虑数据访问模式:在设计数据模型时,首先要考虑数...
    99+
    2024-04-09
    Couchbase
  • 云服务器cvm实例的计费模式有哪些类型和特点分析
    云服务器cvm实例的计费模式通常分为以下几种类型和特点: 按小时计费:即按照使用分钟数计费,如1G内存或2TB存储空间,使用分钟数越多计费越贵; 按流量计费:即按照访问流量计费,如每分钟访问次数或每台设备每月访问量; 按服务类型计费:如...
    99+
    2023-10-26
    实例 类型 模式
  • 云服务器cvm实例的计费模式有哪些类型及其特点分析
    云服务器cvm实例的计费模式一般有以下几种类型及其特点分析: 按用户数量计费(CU) : 这种计费方式基于单独的CPU或操作系统的计费,用户可以单独购买多台云服务器或者多个实例,具体计费策略会因服务器的数量、性能和用户数量等参数而异。 ...
    99+
    2023-10-26
    实例 类型 模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作