《Effective C#》快速筆記(三)- 使用 C# 表達(dá)設(shè)計(jì)
目錄
二十一、限制類型的可見(jiàn)性
二十二、通過(guò)定義并實(shí)現(xiàn)接口替代繼承
二十三、理解接口方法和虛方法的區(qū)別
二十四、用委托實(shí)現(xiàn)回調(diào)
二十五、用事件模式實(shí)現(xiàn)通知
二十六、避免返回對(duì)內(nèi)部類對(duì)象的引用
二十七、讓類型支持序列化
二十八、提供組粒度的因特網(wǎng)服務(wù) API
二十九、支持泛型協(xié)變和逆變
二十一、限制類型的可見(jiàn)性
1.在保證類型可以完成工作的前提下,應(yīng)該盡可能地給類型分配最小的可見(jiàn)性。
2.我們經(jīng)常下意識(shí)的創(chuàng)建公有類型。可見(jiàn)性越低,以后升級(jí)或更改時(shí)所需要的變化就越小,因?yàn)槟茉L問(wèn)你功能模塊的代碼越少。
3.創(chuàng)建內(nèi)部類是一種常被忽略限制類型作用域的做法,我們經(jīng)常習(xí)慣不假思索地創(chuàng)建公有類。你應(yīng)該仔細(xì)思考這個(gè)一個(gè)類型的作用范圍,即它是將被所有的客戶使用,還是僅用在這個(gè)程序集的內(nèi)部。
4.更少的公有類型可以減少單元測(cè)試的數(shù)量。
5.以公有形式暴露給外界的類和接口將成為你的組件的契約。接口越冗余,日后的修改就越受限。暴露的公有類型越少,以后更新擴(kuò)展的時(shí)候周旋的余地就會(huì)越大。
二十二、通過(guò)定義并實(shí)現(xiàn)接口替代繼承
1.抽象基類為類的繼承體系提供了一個(gè)共用的祖先,接口描述了一組原子性的功能。接口是一種契約,抽象基類則為一組相關(guān)的類型提供了一個(gè)共用的抽象?;惷枋隽藢?duì)象是什么,接口描述了對(duì)象如何表現(xiàn)它的行為。
2.我們可以將可重用的行為提取出來(lái),定義在接口中。由于不相關(guān)的類型均可以實(shí)現(xiàn)一個(gè)接口,這表示代碼的重用率將大大增加。
3.如果向基類中添加一個(gè)方法,所有派生類都將自動(dòng)包含該方法。也就是說(shuō),隨著時(shí)間的推移,仍可以有效擴(kuò)展多個(gè)類型功能的途徑。通過(guò)向基類添加并實(shí)現(xiàn)某種功能,所有的派生類都將立即擁有該功能。而向接口中添加一個(gè)成員,會(huì)破壞所有實(shí)現(xiàn)該接口的類。因?yàn)檫@些類不包含新方法,每一個(gè)實(shí)現(xiàn)都需要進(jìn)行更新,然后重新編譯。
4.在抽象基類和接口之間做選擇,實(shí)際上就表示了對(duì)日后可能發(fā)生變化的不同處理態(tài)度。接口是固定的:我們將一組功能