19:定義并實現(xiàn)接口優(yōu)于繼承類型。
Prefer Defining and Implementing Interfaces to Inheritance。
接口支持多重繼承,可以作用于值類型,而抽象類則不可以;抽象類中可以定義字段或方法,減輕創(chuàng)建子類(復(fù)用)的同時增加了子類與父類之間的耦合度;子類繼承接口表達的是“can-do”的關(guān)系,而子類繼承抽象類表達的是“is-a”的關(guān)系。
20:明辨接口實現(xiàn)和虛方法重寫。
Distinguish Between Implementing Interfaces and Overriding Virtual Functions。
派生類不能重載基類(繼承接口)中的接口成員。
21:使用委托表達回調(diào)
Express Callbacks with Delegates
返回值總是委托鏈上最后一個函數(shù)調(diào)用后返回的值;在委托鏈中拋出的任何異常都會終止委托鏈的繼續(xù)調(diào)用。
22:使用事件定義對外接口。
Define Outgoing Interfaces with Events。
觀察者模式(Observer Pattern).
23:避免返回內(nèi)部類對象的引用。
Avoid Returning References to Internal Class Objects。
四個策略來保護類的內(nèi)部數(shù)據(jù)結(jié)構(gòu)不被無意的修改:值類型,恒定類型,接口和包裝(模式)(e.g:返回DataView而不是DataSet)。
24:聲明式編程優(yōu)于命令式編程.
Prefer Declarative to Imperative Programming.
在C#中,編程時使用特性(Attribute)就是申明式編程。使用特性來表明意圖時,可以減少在大量類似的手寫算法中出現(xiàn)邏輯錯誤的可能。
25:盡可能將類型實現(xiàn)為可序列化的類型.
Prefer Serializable Types.
BinaryFormatter和SoapFormatter反序列化不會調(diào)用構(gòu)造函數(shù)和屬性訪問器(property Set/Get)(如果有的話),且能夠序列化非public成員;而XML反序列化會調(diào)用構(gòu)造函數(shù)和屬性訪問器(如果有的話),且只能夠序列化public屬性和字段。
盡可能的使用默認(rèn)序列化特性([SerializableAttribute]),當(dāng)默認(rèn)特性不滿足時(e.g:在不同版本之間轉(zhuǎn)換)要實現(xiàn)ISerializable 接口。
26:使用IComparable和IComparer接口實現(xiàn)排序關(guān)系。
Implement Ordering Relations with IComparable and IComparer.
IComparable是以提供方法來比較兩個特定類型的對象;IComparer可以為排序提供一個可選的排序依據(jù),這可以用于一些沒有給你提供排序依據(jù)的類型上,提供你自己的排序依據(jù)。
e.g:http://support.microsoft.com/kb/320727/
27:避免ICloneable接口.
Avoid ICloneable.
對于值類型,不應(yīng)該實現(xiàn)ICloneable接口,而應(yīng)該使用賦值語句。對于引用類型,只有在確實必要進行拷貝時,才在子類上實現(xiàn)對ICloneable的支持;基類在可能要對ICloneable進行支持時,應(yīng)該創(chuàng)建一個受保護的構(gòu)造函數(shù)。總之,我們應(yīng)該盡量避免使用ICloneable接口。
28:避免強制類型轉(zhuǎn)換操作符。
Avoid Conversion Operators.
通過構(gòu)造函數(shù)來代替定義類型轉(zhuǎn)換操作。
29:只有當(dāng)強制更新基類導(dǎo)致問題時才考慮使用new修飾符。
Use the new Modifier Only When Base Class Updates Mandate It.
在子類的方法上使用new修飾符,只是隱藏了從父類繼承而來的方法,而并不是重寫覆蓋,因此在子類的方法表中,存在兩個方法槽(slot)。當(dāng)子類的引用調(diào)用該方法時,是調(diào)用子類中定義的方法;而當(dāng)子類轉(zhuǎn)化為父類的引用時,是調(diào)用父類中定義的方法!(關(guān)于這一點,也可以參考下我以前寫的《Child類調(diào)用GrandFather類方法引發(fā)的思考》)。因此一般避免在方法上使用new修飾符。
浙公網(wǎng)安備 33010602011771號