精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

有關繼承與擴展方法之比較: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-05-02 08:40:36

機器學習預處理整理

2021-12-23 14:09:43

數據結構算法字符串

2017-04-29 10:16:14

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

2009-12-25 17:11:40

ADO方法

2011-07-01 15:57:06

Gartner存儲云計算

2020-02-16 15:20:18

存儲類型比較

2021-01-30 11:12:21

C#List數據

2009-08-10 18:02:59

.NET 3.5擴展方

2009-08-28 12:41:49

靜態方法與非靜態方法

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技術棧公眾號

国产精品直播网红| 欧美午夜一区二区三区| 精品亚洲欧美日韩| 中文字幕日韩国产| 午夜视频精品| 亚洲人成伊人成综合网久久久| 在线观看免费污视频| 国产第一页在线| 久久综合九色综合97_久久久| 国产日韩精品在线观看| 久久精品国产亚洲AV无码麻豆| 一区二区三区日本久久久| 欧美精品乱码久久久久久| 男女视频网站在线观看| 免费在线观看黄| 大美女一区二区三区| 国产精品欧美日韩一区二区| 国产精品第九页| 无码一区二区三区视频| 国产丝袜高跟一区| 涩视频在线观看| 99tv成人影院| 在线视频欧美区| av高清在线免费观看| www免费在线观看| 久久久久久久av麻豆果冻| 91视频网页| 中国精品一区二区| 久久国产高清| 91精品国产一区| 免费一级肉体全黄毛片| 日韩午夜电影网| 亚洲色图狂野欧美| 亚洲调教欧美在线| 9l视频自拍蝌蚪9l视频成人| 欧美美女一区二区| 黄大色黄女片18第一次| 亚洲成人看片| 欧美日韩免费在线观看| 国产一区二区四区| 日本天码aⅴ片在线电影网站| 中文字幕中文乱码欧美一区二区| 日韩免费电影一区二区| 日韩在线免费播放| www.亚洲激情.com| 久久99热只有频精品91密拍| 亚洲精品字幕在线| 成人中文字幕电影| 成人欧美一区二区三区在线观看| www.黄色av| 国产成人日日夜夜| 国产精品毛片一区视频| 黄色片一区二区三区| 成人a免费在线看| 国产原创精品| 色猫av在线| 久久精品欧美日韩精品| 日本精品一区二区三区不卡无字幕| 欧美伦理影视网| 久久久久久久av麻豆果冻| 明星裸体视频一区二区| 国产在线小视频| 国产亚洲自拍一区| 亚洲一区二区三区精品动漫| 免费网站免费进入在线| 亚洲精品久久久久久国产精华液| 最近免费观看高清韩国日本大全| 成人毛片av在线| 亚洲一区二区在线观看视频| 农民人伦一区二区三区| 欧美极品videos大乳护士| 欧美日韩一区二区免费视频| 日韩在线第三页| 91成人福利社区| 精品久久久久久久久久久久包黑料| 91人人澡人人爽| 亚洲福利天堂| 视频在线观看99| 欧美极品aaaaabbbbb| 亚洲黄色影片| 国产精品成人aaaaa网站| 国产精品嫩草影院精东| 丁香亚洲综合激情啪啪综合| 欧美日韩在线观看一区| 国内外激情在线| 午夜欧美一区二区三区在线播放| 97超碰青青草| 午夜精品久久久久久毛片| 精品久久久久av影院 | 91成人福利视频| 亚洲国产高清一区二区三区| 国产精品久久久久高潮| 亚洲成人一级片| 久久久精品免费观看| 正义之心1992免费观看全集完整版| 蜜臀av在线| 欧美亚洲自拍偷拍| 亚洲无人区码一码二码三码| 精品免费av| 欧美激情在线狂野欧美精品| 波多野结衣绝顶大高潮| 国产.精品.日韩.另类.中文.在线.播放| 精品一区二区久久久久久久网站| 最新97超碰在线| 精品久久久久久久久久久| 在线观看av网页| 亚洲精品进入| 欧美久久精品一级黑人c片| 日本一本在线观看| 成人avav影音| 亚洲av首页在线| 精品亚洲美女网站| 亚洲国产成人精品女人久久久 | √天堂8在线网| 在线亚洲高清视频| 国产又黄又粗又猛又爽的视频| 久久综合电影| 国产成人av在线播放| 免费看黄色一级视频| 亚洲欧美偷拍另类a∨色屁股| 免费日韩中文字幕| 青青操综合网| 欧美精品福利在线| 国产超碰人人模人人爽人人添| 国产欧美精品一区二区色综合| 日韩视频免费播放| 亚洲一区二区三区四区电影 | 精品无人区卡一卡二卡三乱码免费卡 | 国产乱叫456在线| 欧美激情在线看| 人妻少妇被粗大爽9797pw| 风间由美性色一区二区三区四区 | 在线观看三级网站| 视频欧美精品| 日韩在线视频导航| 中文精品久久久久人妻不卡| 久久综合九色综合97_久久久| 国产av麻豆mag剧集| 国内精品麻豆美女在线播放视频 | 一区三区二区视频| aaaaaa毛片| 久久视频一区二区| 国产精品99久久免费黑人人妻| 老司机成人在线| 久久久亚洲国产天美传媒修理工| 成人福利小视频| 一区二区三区欧美亚洲| 女教师高潮黄又色视频| 欧美视频二区| 国产九色91| 蜜桃视频www网站在线观看| 精品欧美久久久| 久久久久久久久久久久久久久久久| 国产一区二区三区高清播放| 日本高清视频免费在线观看| 91蝌蚪精品视频| 久久免费高清视频| 日漫免费在线观看网站| 在线观看精品一区| 强制高潮抽搐sm调教高h| 国产精品夜夜嗨| 18禁裸男晨勃露j毛免费观看 | 日本成人三级电影网站| 国产经典一区| 久热精品视频在线观看| 丰满人妻一区二区三区免费| 亚洲mv大片欧洲mv大片精品| 亚洲做受高潮无遮挡| 免费在线亚洲欧美| 无码免费一区二区三区免费播放| 日韩毛片免费视频一级特黄| 欧美极品少妇xxxxx| 青青久在线视频| 欧美日韩一本到| 欧美成人免费观看视频| www.亚洲免费av| 激情五月亚洲色图| 一区二区蜜桃| 久久精品国产精品青草色艺| 秋霞国产精品| 欧美大荫蒂xxx| 免费看男男www网站入口在线| 欧美色图12p| 国产精品日日夜夜| 国产欧美日韩三区| 女同性αv亚洲女同志| 天堂av在线一区| 九九久久九九久久| 国产亚洲电影| 97视频中文字幕| 成人黄色免费短视频| 久久6免费高清热精品| 亚州精品国产精品乱码不99按摩| 欧美色中文字幕| 日本黄色片视频| 综合分类小说区另类春色亚洲小说欧美| 丰满人妻一区二区三区免费视频棣| 久久国产免费| www.日本在线视频| 日韩毛片视频| 欧美日韩精品免费在线观看视频| 伊人久久综合网另类网站| 69视频在线免费观看| 黄色网址在线免费播放| 亚洲美女又黄又爽在线观看| 精品国产无码一区二区三区| 在线观看日韩高清av| 在线观看精品国产| 亚洲狼人国产精品| 精品视频第一页| 久久久久国产精品人| 制服丝袜av在线| 国产麻豆一精品一av一免费| 日韩无套无码精品| 亚洲影音先锋| 欧美精品自拍视频| 国产精品v一区二区三区| 一级日韩一区在线观看| 免费成人结看片| 狠狠色综合色区| 日本在线视频一区二区三区| 国产美女搞久久| 神马久久资源| 欧美诱惑福利视频| 美女在线视频免费| 97超级碰碰人国产在线观看| 啦啦啦中文在线观看日本| 久久天堂av综合合色| 日韩精品毛片| 色偷偷偷亚洲综合网另类| 国产在线观看免费| 亚洲欧美成人网| 后进极品白嫩翘臀在线视频| 欧美一区二区三区精品| 国产伦精品一区二区三区四区| 在线视频欧美区| 免费在线观看av的网站| 在线免费观看一区| 无码人妻丰满熟妇区五十路| 一本一道波多野结衣一区二区| 99热只有这里有精品| 午夜精品久久久久影视| 国产精品第一页在线观看| 亚洲大片精品永久免费| 日韩欧美一区二区一幕| 精品久久久久久久久久久久久| 在线观看 中文字幕| 婷婷六月综合亚洲| www亚洲视频| 色先锋aa成人| 国产三级理论片| 欧美日韩一级大片网址| 国产精品玖玖玖| 欧美成人vr18sexvr| 无码h黄肉3d动漫在线观看| 精品视频久久久久久| 成年人在线观看| 日韩在线观看免费高清完整版| 欧美精品hd| 久久99亚洲热视| 成人免费网站观看| 国精产品一区一区三区有限在线| 国产不卡123| 国产精品久久久久9999| 成人在线分类| 国产精品免费一区二区三区四区| 日韩精品丝袜美腿| 视频一区不卡| 欧美久久综合| 国内外成人激情视频| 日本网站在线观看一区二区三区 | 欧美色图婷婷| 日本一区二区三区视频免费看| 久久综合88| 久久视频这里有精品| 日本在线不卡视频| 手机毛片在线观看| 精品一区二区成人精品| 特黄特色免费视频| www亚洲一区| 欧美另类69xxxx| 一区二区三区在线影院| 日本免费一二三区| 欧洲亚洲国产日韩| xxxx国产精品| 国产小视频国产精品| 在线观看h网| 国产va免费精品高清在线| 亚洲成人a级片| 精品欧美国产| 小处雏高清一区二区三区| 欧美性生交xxxxxdddd| 精品一级少妇久久久久久久| 一本一道综合狠狠老| 精品人妻无码一区二区三区蜜桃一| 日韩电影大全免费观看2023年上| 色欧美激情视频在线| 18一19gay欧美视频网站| 四虎视频在线精品免费网址| 激情视频在线观看一区二区三区| 日韩理论在线| wwwxxx黄色片| 国产成人av电影在线观看| 国产1区2区在线观看| 午夜视频在线观看一区| 97人人爽人人爽人人爽| 亚洲欧美日韩中文在线制服| 91最新在线视频| 国产精品欧美一区二区| 日韩大胆成人| 日本一本中文字幕| 久久er精品视频| 性欧美精品男男| 黑人巨大精品欧美一区二区一视频 | 99精品国产福利在线观看免费| 五月婷婷六月丁香激情| 久久亚洲精品国产精品紫薇| 久久亚洲精品大全| 91精品国产色综合久久不卡电影| 国产三级视频在线| 欧美亚洲一级片| 国产精品久久久久久久久久白浆| 少妇熟女一区二区| 欧美一区=区| 你懂得在线视频| 亚洲午夜久久久久久久久电影院| av男人天堂av| 色哟哟亚洲精品一区二区| 超碰在线cao| 国产成人精品一区二区三区福利| 一本一道久久综合狠狠老| 亚洲激情在线看| 国产精品每日更新在线播放网址| 亚洲精品久久久久久久蜜桃| 日韩av在线不卡| 97超碰在线免费| 国产一区二区三区四区五区在线 | 亚洲高清视频在线播放| 欧美成人免费大片| 日韩欧美高清一区二区三区| 99久re热视频精品98| 国产成人午夜高潮毛片| 国产在线拍揄自揄拍无码视频| 精品国产伦一区二区三区免费| 羞羞的视频在线看| 国产精品区一区| 亚洲区国产区| 魔女鞋交玉足榨精调教| 欧美日韩亚洲视频一区| 国产二区视频在线观看| 国产精品日韩在线| 91精品在线观看国产| 国产男女无遮挡猛进猛出| 一区二区三区中文在线| 天天操天天干天天插| 国产成人91久久精品| 久久国产精品亚洲人一区二区三区 | 亚洲精品在线国产| 人妻夜夜添夜夜无码av| 久久亚洲精华国产精华液| 在线观看亚洲黄色| 色婷婷**av毛片一区| 日韩一二三区在线观看| 国产一级爱c视频| 国产欧美日韩精品一区| 国产精品久久久久久免费| 欧美日韩成人精品| 青青草原在线亚洲| 美女少妇一区二区| 亚洲另类中文字| 五十路在线视频| 国产精品久久77777| 亚洲欧洲中文字幕| 国产不卡一区二区视频| 亚洲另类春色校园小说| 久久久久免费精品| 亚洲欧洲国产日韩| 二区三区在线视频| 日本亚洲欧美成人| 先锋资源久久| 日本黄色动态图| 欧美视频一区二区三区| 污视频网站免费在线观看| 精品一区久久| 精品无人码麻豆乱码1区2区| 亚洲欧美日韩另类精品一区二区三区| 久久婷婷久久| 亚洲色婷婷一区二区三区| 亚洲激情视频在线| 欧美三级电影网址| 黄色片网址在线观看| 国产精品无遮挡| 天天干天天干天天干| 成人精品久久久| 乱码第一页成人| 亚洲av无码一区二区三区在线| 日韩精品黄色网| 香蕉成人app| 99视频在线视频| 欧美日韩久久久久|