簡體   English   中英

為什么默認情況下不密封類?

[英]Why aren't classes sealed by default?

我只是想知道,由於Sealed關鍵字的存在表明是否允許其他類從它繼承是類作者的決定,為什么默認情況下不密封類,用一些關鍵字將它們顯式標記為可擴展?

我知道這有點不同,但訪問修飾符是這樣工作的。 默認情況下是限制性的,只有插入關鍵字才能授予更全面的訪問權限。

不過,我很有可能沒有正確地考慮過這一點,所以請保持人性化!

我會說這只是一個錯誤。 我知道很多人(包括我自己)相信類確實應該默認密封。 在那個陣營中,C# 設計團隊中至少有幾個人。 自從 C# 最初被設計以來,鍾擺已經在某種程度上偏離了繼承。 (當然,它有它的位置,但我發現自己很少使用它。)

就其價值而言,這並不是過於接近 Java 的唯一錯誤:我個人寧願 Equals 和 GetHashCode 不在對象中,而且您也需要特定的 Monitor 實例來鎖定......

在我看來,不應該有默認語法,那樣你總是明確地寫出你想要的。 這迫使編碼人員理解/思考更多。

如果你想要一個類是可繼承的,那么你寫

public extensible class MyClass

除此以外

public sealed class MyClass

順便說一句,我認為訪問修飾符也應該如此,禁止默認訪問修飾符。

繼承是 OO 的基本原則,因此可以說,默認情況下禁止繼承是不直觀的。

您可能會提出盡可能多的支持默認密封的論據。 如果反過來,有人會發布相反的問題。

我不記得聽說過默認情況下不密封類的決定的理由。 但是,肯定有不少人認為 C# 應該被指定為默認值:

http://codebetter.com/blogs/patricksmacchia/archive/2008/01/05/rambling-on-the-sealed-keyword.aspx

密封類防止繼承,因此是面向對象的組合。 有關詳細信息,請參閱此咆哮;-)

僅僅從未密封的類派生不會改變類的行為。 可能發生的最壞情況是基類的新版本將添加一個與派生類同名的成員(在這種情況下,只會有一個編譯器警告說您應該使用newoverride修飾符)或基類類是密封的(如果類已經被釋放到野外,這是一個設計禁忌)。 任意 sublassing 仍然符合Liskov 替換原則

在 C# 中默認成員不可重寫的原因是因為重寫方法可以以基類的作者沒有預料到的方式更改基類的行為。 通過將其明確抽象或虛擬化,表示作者意識到它可以改變或超出他們的控制范圍,作者應該考慮到這一點。

Word 80% 的功能都沒有使用。 80% 的類沒有被繼承。 在這兩種情況下,偶爾會有人出現並想要使用或重用某個功能。 為什么原設計者要禁止重用? 讓重用者決定他們想要重用什么。

出於同樣的原因,默認情況下對象不是私有的

或者

與對象模擬一致,默認情況下對象不是私有的

只是猜測,因為歸根結底這是一種語言的設計決定,而創作者所說的是經典材料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM