日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2025/5/22 asp.net 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET独有的精巧泛型设计模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在.NET發(fā)展史中,2.0是具有里程碑意義的一個版本。從這個版本,.NET青出于藍(Java),而勝于藍。在.NET 2.0帶來的諸多新特性中,我認為泛型是最重要,沒有之一。

雖然泛型出現(xiàn)已有多年,連Java都早已借鑒引入了泛型(雖然是語法糖),可是用泛型的編程思維方式并沒有得到相應(yīng)的普及。一方面是由于過去大量的Framework仍然是在非泛型時代寫成的,另一方面泛型的設(shè)計模式?jīng)]有得到發(fā)展,改變的時候該到了。

來舉一個例子說明這兩點。我們?nèi)绻麑戇^網(wǎng)絡(luò)數(shù)據(jù)抓取的代碼,應(yīng)該熟悉這樣的代碼:

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;

?我想過,但沒想明白。上面兩種寫法,都是調(diào)用父類的工廠方法,實際返回了一個子類的實例。顯然,即使不了解OCP,憑直覺也應(yīng)該想到,父類的實現(xiàn)中不應(yīng)該被子類所決定。寫WebRequest和Image的前輩可能也覺得直接返回子類實例不妥,所以陰險地把方法簽名的返回類型改成了父類。

雖然這種行徑值得嚴重鄙視。但.NET程序員大都是人云亦云,照葫蘆畫瓢的好學生,所以這個問題多年了也沒有修改。

理想的設(shè)計應(yīng)該是這樣:父類的每個子類,都有獨立的工廠方法,返回其自身的實例。這樣做法,在泛型出現(xiàn)前非常笨拙,得不償失,但有了泛型,就可以精巧地實現(xiàn)。

以模擬Image類為例,Image和BitMap實現(xiàn)如下:

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);

?

輸出結(jié)果如下:

Path: e:\me.jpg
Type: Bitmap

為了讓大家更熟悉一下,再舉一個實現(xiàn)數(shù)據(jù)結(jié)構(gòu)中的二叉樹作例子。

傳統(tǒng)的樹節(jié)點類,無論無論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樹、紅黑樹等等。實現(xiàn)特殊的二叉樹數(shù)據(jù)結(jié)構(gòu),勢必要繼承TreeNode。由于樹節(jié)點的類型中,有類型為基類的成員,所以在子類操作這些成員時,往往也要強制轉(zhuǎn)換類型,這比Image和WebRequest的例子,只在實例創(chuàng)建時轉(zhuǎn)換類型還麻煩。

這就該泛型模式一顯身手的好機會了,請看其父類型的實現(xiàn):

/// <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; } }

?

之后,實現(xiàn)任何一種特殊二叉樹結(jié)構(gòu),比如RBTreeNode代表紅黑樹節(jié)點,可以這樣:

class RBTreeNode : TreeNode<RBTreeNode,Int32> {/// <summary>/// 樹節(jié)點顏色,是否為紅。/// </summary>public bool IsRed { get; set; }public override string ToString(){return this.Value + "," + (this.IsRed ? "R" : "B");} }

?

這個是AVL樹:

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

?

不但完全符合OCP原則,而且再也不需要as來強制轉(zhuǎn)換節(jié)點類型了。

這肯定不是我的首創(chuàng),其實.NET Framework中已經(jīng)不少這樣的設(shè)計,比如IComparable<T>接口。也有不少優(yōu)秀的框架采用了類似的設(shè)計,比如大石頭同學的ORM框架NewLife.XCode。

看上去也很簡單吧,但是很多人思維還停留在面向?qū)ο笳Z言剛誕生的階段,還不習慣用這種設(shè)計模式。我認為這種寫法足夠典型和通用,足以得上一種設(shè)計模式,而且是.NET特殊優(yōu)勢,獨特魅力。

說到設(shè)計模式,其實GOF提出的23種設(shè)計模式多年了,已經(jīng)過時,出現(xiàn)了許多新模式(比如并發(fā)編程方面,參考Wiki Design Pattern)。舊有的模式中,有的已經(jīng)包含在.NET語言特性中,有的模式實現(xiàn)方式已經(jīng)改頭換面。尤其在泛型出現(xiàn)后,許多模式的實現(xiàn)可以變得簡潔許多,優(yōu)雅許多。

不要一遍遍炒過去的冷飯,設(shè)計模式應(yīng)該與時俱進,永遠是充滿新鮮活力的話題。

轉(zhuǎn)載于:https://www.cnblogs.com/XmNotes/archive/2012/04/23/2466938.html

總結(jié)

以上是生活随笔為你收集整理的.NET独有的精巧泛型设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品国产18久久久久久二百 | av永久免费网站 | 亚洲成人第一网站 | 亚洲情热| 视频在线观看91 | 国产天堂av在线 | 中文字幕精品一二三四五六七八 | 欧美黄色免费看 | 麻豆一区二区99久久久久 | 午夜免费av | 欧美日韩v | 一区二区视频免费观看 | 嫩草av久久伊人妇女超级a | 91精品亚洲一区 | 色综合天天干 | 午夜精品一区二区三区在线观看 | 欧美精品在线视频 | www中文在线| 又粗又猛又爽又黄的视频 | 啊v视频在线 | 男人深夜影院 | 日韩一区电影 | 五月激情婷婷网 | 日韩精品短片 | 天天爽天天爽天天爽 | 先锋资源一区二区 | 中文字幕av专区dvd | 国产成人一区二区三区视频 | 日韩一级网站 | 呦呦av | 久久9热| 免费观看av的网站 | 日韩亚洲精品视频 | 99re这里只有精品66 | 中文字幕永久在线 | 永久免费快色 | 18久久 | 国产精品成人在线 | 色婷婷777| 一二三区免费 | av免费资源 | 国产女主播一区二区三区 | 国产我不卡 | 先锋资源久久 | 男人的天堂网av | 艳妇臀荡乳欲伦交换在线看 | 久久爱网 | 狠狠撸在线视频 | 免费看一级片 | 日韩不卡一区 | 香蕉久久精品 | 俄罗斯av在线 | 天堂av片| 成人免费毛片高清视频 | 欧美一区二区三区爽爽爽 | 水蜜桃av在线 | 欧美另类精品xxxx孕妇 | 91精品视频网 | 国产av成人一区二区三区 | 国产成a人亚洲精v品无码 | 最近中文字幕在线免费观看 | 久久精品免费电影 | 青娱乐久久 | 天天综合一区 | 欧美精品乱人伦久久久久久 | 九九av在线 | 伊人中文字幕在线观看 | 免费精品一区二区 | 精品国产丝袜一区二区三区乱码 | 香蕉视频链接 | 日本黄网在线观看 | 特级丰满少妇一级aaa爱毛片 | 中文字幕3区 | 久久美女视频 | 日韩性xxx | 国产一级不卡毛片 | 有色影院 | 在线观看免费黄视频 | xxxxx毛片 | 一级人爱视频 | 在线亚洲自拍 | 老湿福利影院 | 伦av综合一区 | 久久婷婷热 | 九色porn | 日本免费一区二区三区四区 | 午夜av片 | 亚洲蜜桃在线 | 特级西西人体 | 日韩在线观看免费网站 | 捆绑少妇玩各种sm调教 | 国产一区亚洲二区三区 | 欧美日韩国产区 | 一级片免费的 | 精品成人国产 | 色噜噜在线观看 | 啪啪网视频 | 亚洲精品久久久久av无码 | 亚洲成人午夜影院 |