《Effective C#》某些地方实在是对不起Effective这个词(I)
翻了一半,到某些地方實在是看不下去了,鑒于這本書的名氣和傳說中的銷售量,這些地方拿出來給大家討論討論,對看了這本書而又沒發現這些東西的安達應該是有益的.
??????條款19:Prefer Defining and Implementing Interfaces to Inheritance。該條款教導我們,盡量定義并實現接口,而不是使用繼承。
??????實際上,抽象類具有一些接口不可能提供的特點。
??????1、接口只是提供了實現類提供的行為,而沒有提供這些行為的規范。如:一個調制解調器接口包括:撥號、發送數據、接收數據、掛斷這些行為,但是并沒有也沒辦法定義說發送數據之前,必須得先撥號,且撥號必須成功這樣的規范;但是抽象類不同,它可以定義它們。
??????2、在抽象類中增加一項功能,它的派生類就自動擁有了這些功能;這東西顯然通過接口實現不了——在接口中增加一向功能的后果是所有的實現類都得重寫,并重新編譯。
??????在實際項目中,碰到過這種讓人非常頭痛的情況。所以一般做法是提供接口,然后提供一個實現了這個接口的抽象類。派生類一般情況下是從抽象類派生,而不是直接去實現接口。
??????OK,現在我們再來看<Effective C#>中提到的證明使用接口而不使用抽象類的反例:
??????
{
??foreach(?object?o?in?collection?)
??Console.WriteLine(?"Collection?contains?{0}",
????o.ToString(?)?);
}
public?void?PrintCollection(?CollectionBase?collection?)
{
??foreach(?object?o?in?collection?)
??Console.WriteLine(?"Collection?contains?{0}",
????o.ToString(?)?);
}
??????書里面說了
“The second method is far less reusable. It cannot be used with Arrays, ArrayLists, DataTables, Hashtables, ImageLists, or many other collection classes. Coding the method using interfaces as its parameter types is far more generic and far easier to reuse.”大體意思是第二個方法可用性很差勁,它不能使用諸如:Arrays、ArrayLists、DataTables等等,使用第一種使用接口做參數方法就很好,用起來很方便。
??????現在的問題是:誰會這么寫代碼呢?作為一個方法的參數,它可能會有一些限制,比如上述的PrintCollection。對該方法的實現,唯一的限制是它得實現IEnumerable接口,只要入口參數實現了這個接口,方法就可以完成預定義的語義。第二種寫法擴大了限制的范圍,擺明了后果就是可用性降低。
??????定義一個方法的入口參數類型,一個很重要的原則就是:最小限制化。
??????該原則同樣適用于泛型類和泛型方法的定義。
??????它后面的例子犯的錯誤如出一轍。
??????吃飯時間到了,其他的忽悠稍后。^_^
-- 補充點東西,見文《補》
轉載于:https://www.cnblogs.com/cn_wpf/archive/2007/07/19/823626.html
總結
以上是生活随笔為你收集整理的《Effective C#》某些地方实在是对不起Effective这个词(I)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京奥运会和上海世博会广告登上巴士 亮相
- 下一篇: 两个ListBox的相互操作