Dot-Net

介面 + 擴展(mixin)與基類

  • April 23, 2009

介面+擴展方法(mixin)比抽像類更可取嗎?

如果您的答案是“取決於”,它取決於什麼?

我看到介面+擴展方法有兩個可能的優勢。

  • 介面是可多重繼承的,而類則不是。
  • 您可以使用擴展方法以非破壞方式擴展介面。(實現您的介面的客戶端將獲得您的新基本實現,但仍然能夠覆蓋它。)

我還沒有想到這種方法的缺點。介面+擴展方法失敗的原因可能非常簡單。

關於這個主題的兩篇有用的文章是

擴展方法的缺點:C#3/VB9 之前的客戶端將無法輕鬆使用它。

就我而言,就是這樣——我認為基於介面的方法要好得多。然後,您可以很好地模擬出您的依賴關係,並且所有內容基本上都沒有那麼緊密耦合。我不是類繼承的忠實擁護者,除非它真的是關於專業化的:)

編輯:我剛剛想到了另一個可能相關的好處。一些具體的實現可能會提供一些通用方法的更優化版本。

Enumerable.Count就是一個很好的例子——它顯式地檢查序列是否實現IList,因為如果它實現了,它可以呼叫Count列表而不是遍歷整個序列。如果IEnumerable<T>它是一個帶有虛擬Count()方法的抽像類,它可能會被覆蓋,List<T>而不是有一個IList明確知道的實現。我並不是說這總是相關的,也不IEnumerable<T>應該是一個抽像類(絕對不是!)——只是指出它可能是一個小的缺點。這就是多態性真正適合的地方,通過專門化現有行為(誠然,以一種只影響性能而不是結果的方式)。

引用自:https://stackoverflow.com/questions/783312