2017-04-26 70 views
2

我最近一直在使用System.Versionclass並且想知道爲什麼它和其他一些類似簡單的類被標記爲SealedNotInheritable在VB中)。爲什麼CLR中的某些類被密封?

與一些更復雜的課程不同,我沒有看到這樣的課程通過密封會獲得什麼。

據我可以告訴sourceVersion並不意味着任何理由。

是否有已發佈/官方(即不是基於意見)的原因?是否有可能由此導致的一些問題?特別是對於Version的情況,或者對於類似簡單的類別,則不合格。

背景:我不得不重新創建Version類,以便通過雙向綁定使用它,因爲MS版本具有ReadOnly屬性。但我需要知道,如果派生會導致一些問題

+1

請問這個問題的答案足夠http://stackoverflow.com/a/7777674/920557?請參閱[2]部分 –

+0

@EugeneKomisarenko謝謝,有點。第1部分對於爲什麼一個*應用程序*程序員可以封閉一個類而言是顯而易見的(與CLR程序員相反)。第二部分給出的信息聽起來合乎邏輯,但基於異端,並沒有多大意義,因爲MS基礎類是爲了拯救我們的工作,而不是強迫我們複製它。如果可能的話,我更喜歡更具體的來源/原因。 – Toby

+0

我相信在設計繼承或禁止它。設計繼承需要一些工作,並且通常會進一步限制實現。考慮到這一點,類應該被密封或設計爲能夠繼承它們。如果你有一個你無法控制的基類實現呢?一個密封的類可以防止你無法控制的基類問題,並且不打算繼承。 – Codexer

回答

1

Version是表示「價值」一類,類似DateTime,但過大舒適融入一個struct,它的class。但是,相同的設計原則適用。表示值的類型應該是不可變的和密封的(值類型總是被密封的)。

您也可以清楚地看到價值的其他特點:

  • object.Equalsobject.GetHashCode被覆蓋。
  • 它實現IEquatable<Version>
+0

當結構「太大」時,是否有規則或經驗法則?來自C背景我*一般*喜歡保持我的結構只爲田野;如果他們需要功能,那麼這是一個類。 – Toby

+2

@Toby,有關一般準則,請參見:[在類和結構之間選擇](https://msdn.microsoft.com/en-us/library/ms229017(v = vs.110).aspx)。 – TnTinMn

+0

對於我未來的參考,在這種特定的情況下,我的「BetterVersion」類應該實際上*包裝CLR Version類而不是從它繼承(「is-a」關係),由它組成(「has-a」關係)或再現它。 – Toby