2010-09-04 81 views
5

只是一個關於C++/cli的小問題。 抽象類有派生類實現的抽象方法, 密封類不允許繼承。摘要密封類

那麼,爲什麼我們有一些.NET基類庫中的類定義爲抽象密封,你可以找到很多.. ??!

+0

例子?這對我來說是一個有趣的設計決策,所以我想看看哪些是它:) – 2010-09-04 21:10:19

+0

http://msdn.microsoft.com/en-us/library/system.math.aspx – 2010-09-04 21:32:41

回答

15

它相當於C#語言中的「靜態類」。用於編寫幾乎所有BCL類的語言。所有的方法必須是靜態的。聲明它的抽象和密封可以防止任何人從類中派生出來並創建它的一個實例。

該類方法與C和C++語言中的自由函數完全等價。 CLR不支持的東西。

+0

我完全同意你,becuause它看起來像JAVA'S MATH類,但爲什麼msdn文檔聲明,如果你能做到這一點,這是不可能的或正確的! – 2010-09-04 22:06:19

+0

@Ebraheem Najjar:只能在IL層面直接做到這一點。編譯器不會讓你直接編寫一個「密封的抽象」類。 – 2010-09-04 22:28:47

+0

類中的IL屬性與該語言中的關鍵字不同。在C#中,聲明一個類是封閉的*和*抽象是沒有意義的,它會抱怨。聲明它是靜態的是什麼打開這些IL屬性。 「靜態」類沒有CLR模擬。 – 2010-09-04 22:38:21

2

它們不能同時抽象並密封,它是沒有意義

密封類不能被用作基類。出於這個原因,它不能也是一個抽象類。密封類防止派生。因爲它們永遠不能用作基類,所以一些運行時優化可以使調用密封類成員的速度稍快。

http://msdn.microsoft.com/en-us/library/ms173150.aspx

+0

他的意思是C++/cli。嘗試 public ref class CProperty sealed abstract { }; – 2010-09-04 21:29:27

+7

靜態C#類實際上是'abstract sealed',儘管你不能在代碼中明確地使用這些修飾符。但OP在談論C++/CLI,那裏沒有靜態類的概念 – 2010-09-04 22:04:40