国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

有關繼承與擴展方法之比較:ObservableCollection

開發 后端
本文對繼承子類與擴展方法進行了一番比較,比較案例是對ObservableCollection進行排序。經過比較,作者認為繼承和擴展方法兩者實在是難分伯仲。

前段時間,我做的一個項目有一個小小的需求,即:對范型集合類型ObservableCollection< T>進行排序。ObservableCollection< >這個類型在WPF和Silverlight中非常有用,因為它實現了INotifyCollectionChanged接口,繼而在進行數據綁定的時候,如果將ItemsControl的ItemsSource屬性綁定到一個ObservableCollection< T>對象上,那么當這個集合變化的時候(Add, Remove, Insert, Clear等等),相應的ItemsControl也會同步Update。由于ObservableCollection< T>繼承自Collection< T>,因此它沒有List< T>提供的Sort方法,所以如果我們想對ObservableCollection進行排序的話,就需要自己實現。

繼承與擴展方法:兩個解決方案

針對這個需求,我想到兩個方案解決,方案一就是寫一個子類,繼承ObservableCollection,進而在其中實現Sort方法,相應的代碼如下:

 1    public class SortableObservableCollection< T> : ObservableCollection< T>
 2    {
 3        public void Sort()
 4        {
 5            Sort(Comparer< T>.Default);
 6        }
 7
 8        public void Sort(IComparer< T> comparer)
 9        {
10            int i, j;
11            T index;
12            for (i = 1; i <  this.Count; i++)
13            {
14                index = Items[i];
15                j = i;
16                while ((j > 0) && (comparer.Compare(Items[j - 1], index) == 1))
17                {
18                    Items[j] = Items[j - 1];
19                    j = j - 1;
20                }
21                Items[j] = index;
22            }
23        }
24    }

方案二是為ObservableCollection< T>添加擴展方法,相應的代碼如下:

 1    public static class ObservableCollectionExtension
 2    {
 3        public static void Sort< T>(this ObservableCollection< T> Collection)
 4        {
 5            Collection.Sort(Comparer< T>.Default);
 6        }
 7
 8        public static void Sort< T>(this ObservableCollection< T> Collection, IComparer< T> comparer)
 9        {
10            int i, j;
11            T index;
12            for (i = 1; i <  Collection.Count; i++)
13            {
14                index = Collection[i];
15                j = i;
16                while ((j > 0) && (comparer.Compare(Collection[j - 1], index) == 1))
17                {
18                    Collection[j] = Collection[j - 1];
19                    j = j - 1;
20                }
21                Collection[j] = index;
22            }
23        }
24    }

注:以上的代碼只是例子,并沒有對Argument進行應有的check,也沒有考慮運行時是否會出現其他異常。

繼承與擴展方法之比較

這兩個方案都可以滿足需求,那么就需要對它們的進行一下比較以便采取更優秀的方案。結合以上的案例,我主要是以下幾點進行比較(當然也有一些并不適用于以上例子,我也一并比較了):

1)針對程序集引用與命名空間合并:

無論是繼承還是擴展方法,如果被繼承和擴展的類不在我們的程序集中,那么為了使用擴展的新功能,我們就必須引用這個新的程序集,同時我們可以在新的程序集中把命名空間寫成和原有類所在的命名空間一樣,因此在這一點上,二者是平手。

2)針對sealed類:

由于sealed類不能再被繼承,因此在這種情況下我們如果需要為某一個密封類擴展功能,那么只能考慮擴展方法,在這次較量中,擴展方法+1

3)針對public, protected, internal, private成員:

擴展方法其實只是語法糖,這點想必大家都清楚,因此在我們使用擴展方法的時候,是無法獲得對象private和protected成員的使用權限的,如果不在一個程序集中,internal也將變為不可見。相比之下,繼承的優勢在于可以訪問到protected成員,因此在此役中繼承+1

4)針對多態:

擴展方法只能對類擴展public成員,因此只能夠能過方法的overload來實現靜態多態特性,雖然通過this關鍵字傳入方法體的對象能夠在調用上使用override方法,但是您無永遠在擴展方法中實現override一個方法,而繼承則可以對基類中的abstract和virtual成員進行override,從而獲得動態多態特性,當然overload也成了小兒科。因此在此役中繼承+1

5)針對接口和抽象類的擴展方法:

C#3.0多出來的Linq命名空間下為IEnumerable接口添加了N多的擴展方法,雖然如果搞不清楚亂用會造成很多問題,但是它們的確讓我們的開發變得簡單明了。如果對于接口和抽象類實現擴展方法,那么受益者將會很多,凡是實現了該接口的類都將擁有這些擴展方法,而繼承(這里對于接口應該不能稱作繼承,而是implement)卻無法達到這一效果。當然有些功能我們只希望某一個類或者某一些類才有,而不是像擴展方法這樣讓所有抽象類的子類和實現接口的類都具有這個功能,但是在這次比較中,擴展方法仍然更勝一籌,擴展方法+1

6)針對代碼的擴展性和維護性:

有很多時候,代碼已經寫好才突然出現某一些附加的需求,比如我已經寫好了數據綁定的邏輯,用的正是ObservableCollection,如果我需要用繼承一個子類擴展Sort方法,那么我將需要更改很多處代碼。甚至有些時候代碼是別人寫的,已經編譯成程序集來給你用,你可以在他的代碼里得到ObservableCollection對象,卻再也無法將這個對象變成SortableObservableCollection使用了。因此在這種情況下,除非反編譯已經生成的程序集,不然就只能通過擴展方法實現了。而且如果再有新的需求,我們完全可以再寫一個static class加入新的擴展方法,這一點繼承一個子類是無法滿足需要的。因此,此役中擴展方法+1

7)關于反射:

大家都知道反射在某些時候是一種很方便的手段,或者說是不得不用的手段。在有反射參與的情況下,擴展方法可以說沒了用武之地,比如剛才那個ObservableCollection,我得到typeof(ObservableCollection)之后,仍然無法得到Sort方法的MethodInfo,因此也無法Invoke,原因是那個Sort方法是定義在ObservableCollectionExtension這個靜態類當中的,如果我想用Sort方法就必須反射ObservableCollectionExtension,這對于使用者是極為不便的。然后對于繼承,這個問題就不會出現,我當然能夠在SortableObservableCollection的Type中找到Sort方法對應的MethodInfo。因此,在有反射參與的情況下,繼承+1

8)關于面向對象:

我一直覺得面向對象是仁者見仁,智者見智的東西,而且不同的場合不同的應用對于兩個方案可能會有不同的選擇。按照道理說,無疑繼承更加面向對象一點,當然這只是我個人的感覺。其實上面提到過擴展方法也能夠在方法調用上體現多態,只不過是它無法override方法罷了。因此在這個比較上,繼承子類+0.5

通過上面的幾項比較,其實繼承和擴展方法兩者實在是難分伯仲。我覺得在選擇的時候還是要具體問題具體分析的,比如上面給出的有關protected和sealed這兩個問題,我們就是“不得不”做出選擇,而更多的情形還是需要考慮易用性以及代碼美觀等因素的。比如關于我那個項目,我最終選擇的擴展方法,原因就是我懶得去改以前的代碼了。

那么對于繼承與擴展方法這兩種方式對于擴展一個類的的比較就到此為止了,歡迎大家進行補充,并指出我的不足之處。

本文來自wodehuajianrui的博客。

【編輯推薦】

  1. C#繼承知識詳解
  2. 淺談C#如何實現多繼承
  3. C#中實現多繼承的方式:混合+接口
  4. .NET 3.5擴展方法點評:優點與問題
  5. 淺析C#擴展方法
責任編輯:yangsai 來源: 博客園
相關推薦

2016-08-21 14:19:05

數據工具DataXSqoop

2009-02-11 13:38:00

軟件工程師程序員職業

2011-11-08 16:32:24

LinuxFreeBSDTCP

2011-11-07 10:49:16

IPsec VPNMPLS VPN

2009-08-28 13:57:29

virtual ove擴展點

2017-04-29 10:16:14

機器學習數據清洗數據整理

2017-05-02 08:40:36

機器學習預處理整理

2021-12-23 14:09:43

數據結構算法字符串

2009-12-25 17:11:40

ADO方法

2011-07-01 15:57:06

Gartner存儲云計算

2020-02-16 15:20:18

存儲類型比較

2009-08-10 18:02:59

.NET 3.5擴展方

2009-08-28 12:41:49

靜態方法與非靜態方法

2021-01-30 11:12:21

C#List數據

2009-03-25 16:20:16

數據泄漏信息保護解決方案

2009-08-27 18:04:01

c#擴展方法string

2010-05-12 11:50:29

2013-11-05 09:39:18

HDLC命令配置

2010-03-03 11:06:13

Adroid手機程序

2009-08-31 14:45:10

C#擴展方法
點贊
收藏

51CTO技術棧公眾號

国产成人一区二区三区电影| 成人久久久久久久久| 国产99一区视频免费| 粗大的内捧猛烈进出在线视频| 中文有码一区| 欧美一区二区三区精美影视| 亚洲国产中文字幕| 黄色免费大全亚洲| 国产精彩视频一区二区| 日韩电影网在线| 国产一区二区精品在线观看| 日产精品久久久久久久性色| 日本成人激情视频| 午夜影视日本亚洲欧洲精品| 成人精品毛片| 欧美 日韩 亚洲 一区| 精品亚洲一区二区三区在线播放 | 色噜噜狠狠狠综合曰曰曰88av| 激情五月***国产精品| 电影天堂最新网址| 孩xxxx性bbbb欧美| 伊人色综合久久天天人手人婷| 亚洲啊v在线观看| 国产精品视频一区二区高潮| 蜜乳av综合| 日本高清中文字幕| 国产精品久久久久999| 午夜亚洲福利老司机| 欧美中文一区二区| 女人黄色免费在线观看| 国产专区在线视频| 国产精品成人观看视频国产奇米| 亚洲成人av电影在线| 一本久道综合久久精品| 亚洲电影观看| 麻豆电影在线观看| 日韩一本精品| 精品亚洲一区二区三区在线播放 | 国产视频中文字幕在线观看| 黄色三级中文字幕| 性色av一区二区三区在线观看| 懂色aⅴ精品一区二区三区蜜月| 久久狠狠婷婷| 国产精品色呦| www亚洲人| 久久午夜夜伦鲁鲁一区二区| 91啪国产在线| 国产一区二区三区视频免费| 樱花草国产18久久久久| 国产精品久久久久久久久久妞妞| 99er精品视频| 免费人成在线观看网站| 国产精品88久久久久久妇女| 97视频中文字幕| 久久手机免费视频| 欧美中文字幕一区二区三区| 久久天天做天天爱综合色| 婷婷综合久久| av一级久久| 天天干在线视频论坛| 成人毛片免费在线观看| 欧美少妇一级片| 国产丝袜不卡| 国产精品久久久久9999| 中文字幕日韩av综合精品| 欧美色倩网站大全免费| 久久久久9999亚洲精品| 欧美综合国产| 亚洲高清资源| 中文字幕午夜精品一区二区三区| 午夜激情视频在线观看| eeuss在线播放| 无需播放器的av| 成人在线国产视频| 精品91一区二区三区| 五月婷婷一区| 成人在线观看av| 国产精品午夜一区二区欲梦| 国内精品小视频在线观看| 久久精品99国产精品酒店日本| 在线观看欧美日本| 午夜激情久久久| 性感美女久久精品| 色综合色狠狠综合色| 岛国视频午夜一区免费在线观看 | 亚洲精品蜜桃乱晃| 91精品国产乱码久久久竹菊| 久久精品一级| 天天躁日日躁成人字幕aⅴ| 国产一区二区三区不卡视频网站| 成人激情久久| 国产亚洲电影| 黑人一区二区三区四区五区| 亚洲精品中文字幕| 一本一道久久a久久综合精品 | 国内成人在线| 亚洲男人在线| 在线黄色网页| 国产一区二区三区高清| 日韩毛片精品高清免费| 欧美国产成人精品| 国产精品嫩草影院av蜜臀| 一区二区不卡在线视频 午夜欧美不卡在 | 久久午夜夜伦鲁鲁一区二区| 国产乱xxⅹxx国语对白| 亚洲精品少妇久久久久久| 欧美精品无码一区二区三区| 国产九九在线视频| 日日噜噜夜夜狠狠视频| 国产一二区在线| 成人在线爆射| jizzjizz欧美69巨大| xxxxx国产| 黄色网页在线看| 日本免费一区二区三区视频| 亚洲国产精品免费视频| 91成人精品观看| 成人影院在线| 日韩视频一区二区三区在线播放免费观看| 韩国毛片一区二区三区| 不卡大黄网站免费看| 欧美小视频在线| 欧美成人自拍视频| 久久亚洲午夜电影| www亚洲天堂| 国产精品一区hongkong| 亚洲成人va| 免费观看一级特黄欧美大片| 亚洲国产精品久久久男人的天堂| 亚洲精品一二三| 在线看日韩欧美| 国产精品theporn88| 天堂男人av| 在线精品自拍| 国产精品小仙女| 精品成人久久av| 欧美综合激情网| 欧美一区视久久| 可以在线看的av网站| 成熟了的熟妇毛茸茸| 九色视频一区| 久久亚洲国产精品尤物| 亚洲综合五月| 国产亚洲一区字幕| 欧美在线观看你懂的| 亚洲色图第三页| 99在线热播| 九九九伊在人线综合| 成人国产在线| 亚洲激情自拍| 一区二区三区鲁丝不卡| 欧美激情视频免费观看| 成人免费性视频| 久久青青视频| 久草这里只有精品视频| 日韩精品视频在线免费观看| 91久久精品视频| 在线观看入口黄最新永久免费国产 | 中文字幕精品一区日韩| 亚洲天堂免费电影| 国产综合自拍| 欧美日韩中文字幕在线视频| av观看久久| 青草影视电视剧免费播放在线观看| 极品少妇一区二区三区| 91精品国产色综合久久久蜜香臀| 欧美不卡福利| 最新超碰在线| 黄色日韩网站视频| 亚洲无线码在线一区观看| 成年人视频在线免费| 中文字幕视频精品一区二区三区| 国精品**一区二区三区在线蜜桃| 日韩精品在线影院| 日本特黄a级高清免费大片| 日韩av大片| 欧美一二三四区在线| 在线丝袜欧美日韩制服| 久久天堂av| 亚洲第一激情av| 亚洲第一综合| 日本熟妇人妻xxxxx| 国产资源在线播放| 国产91对白在线观看九色| 久99久在线视频| 色影院视频在线| 国产精品家庭影院| 亚洲精品9999| 亚洲三级在线| 337p粉嫩大胆色噜噜噜噜亚洲| 综合av色偷偷网| 99热播在线观看| 亚洲a一区二区三区| 精品国产91久久久久久久妲己 | 亚洲天堂成人在线| 婷婷激情在线| 国产欧美一区二区在线| 高清欧美性猛交xxxx黑人猛交| 国产一区 在线播放| 久久99成人|