2011-12-08 49 views
8

封閉班級並不是我在過去很注意的事情,但我發現自己想知道什麼是最佳做法。如果你知道一個班級不會或不應該來源於你是否會密封它作爲一個預防措施,只是讓密封的關鍵字知道有人試圖從它派生出來的機會很渺茫。封閉班級

我想我要問的是,你應該把所有不打算繼承的類作爲一個良好的習慣來封印嗎?

+2

可能重複的[我應該密封我認識的所有類不應該用作基類嗎?](http://stackoverflow.com/questions/2164170/should-i-seal-all-classes-i - 知道應該永遠不會被用作基地級) – BoltClock

回答

2

您不應該隨意密封所有不屬於任何時候意味着要繼承的類。

取而代之的是,你認識的印章類別永遠不要從其他人那裏繼承,而應該讓其他人打開。如果在稍後的某個時間點可以做出決定,那些類別不應該被繼承,那麼您可以密封它們。

+7

「在稍後的時間點......你可以密封他們。」只在應用程序代碼中。在庫代碼中,只能解封類,但不能封裝它們,而不破壞構建它的代碼。因此,默認情況下作爲圖書館作者密封是合理的。 – CodesInChaos

+0

我覺得這與應該完成的事情完全相反。以後密封課程是一個突破性的改變,而不是開封。除非你仔細考慮過人們在你的類型中進行子類化時可能做什麼,你可以引入脆弱的基類問題。 – Andy

+0

@安迪 - 你是對的。不幸的是,在答案被接受之後,在其他評論中已經指出錯誤,並且您無法刪除被認爲是被接受的答案的帖子。 –

4

如果您按照open/closed原則處理該字母,則不應使用sealed關鍵字。但我想總有一些角落案例。

+0

+1對於SOLID的O/C – Yuck

+3

您仍然可以遵循封閉類的開放/封閉原則,例如使用組合。推薦的優秀設計原則之一是贊成合成而不是繼承。 http://lostechies.com/gabrielschenker/2009/02/13/the-open-closed-principle/ – cfwall

2

我唯一注意到一個類是密封的是當我真的需要從它得到某些東西,但後來發現我不能。

我從來沒有覺得有必要封閉自己的班級。我根本不認爲我很聰明,知道什麼時候不應該派生出類。我很聰明,但我無法預知未來。

對於要封裝的核心.NET框架類可能會有一定的意義,以便他們可以嚴格控制框架的行爲,但我從來沒有看到日常開發人員需要這樣做的情況。你可能想阻止派生一個班級,但是封閉班級是相當終結的,誰知道你的下一週/月/年/一生會有什麼需求?

0

是的,如果你想讓你的課堂不能被繼承,你只需添加「密封」關鍵字。這個類不能抽象,不能有保護或虛擬的方法/字段。

+0

我瞭解這些基礎知識,我只是好奇哪些被認爲是最佳實踐。 – CSharpened

+1

儘管它可以擁有自己的基礎,並可以繼承它的虛擬成員。 –

4

在應用程序代碼中,所有派生自你的類的代碼都是由你自己控制的,所以默認情況下,大多數類都是未開啓的。如果通過更改基類來破壞派生自類的代碼,則可以簡單地修復它。

但是密封在庫代碼中非常有用。如果您離開課程,您承諾不會破壞任何源自它的代碼。即您增加公共表面面積。國際海事組織的庫房應保持最小的表面面積默認情況下,這意味着密封。

但並不總是需要封閉整個班級。密封一些或全部虛擬方法可能就足夠了。這樣從您的類派生的代碼只能擴展它,但不能通過重寫方法來修改其當前的功能。

另一種類應該經常被密封的類與價值語義。爲非密封類實現正確的平等和僞增變要困難得多。所以我只是簡單地將它們密封起來,避免額外的工作,除非真的必要