2012-07-22 26 views

回答

2

甚至有些類別不會做任何事情,除了讓其他類別從中派生。超類是否可以擁有有用的實例並不重要。只有其他類可以派生出來的類通常稱爲抽象類;某些語言(如C++)也具有語法功能,以便在嘗試從抽象類創建對象時允許編譯器發出錯誤。所以,像這樣的班級不是很糟糕。

除此之外,什麼是「不好的做法」?如果設置使代碼更容易理解,那麼它不會壞。

當然,如果你打算推導的兩個類實際上沒有任何共同之處,而這兩個方法只是「嗨,我注意到該類中的10行代碼與這10行代碼相同另一個階級「,然後把它變成一個普通的超類,可能會讓人困惑不止。班級應該仍然有某種形式的關係。如果只是分享一些隨機出現的代碼,獨立功能可能是更好的選擇。

基本上,看看類的名稱。如果你的新超類被命名爲「某些非常通用的名字」,因爲我不知道它是什麼「,那麼它可能不是」好設計「。另一方面,如果你有一個超類的專有名稱,並且派生類的名字仍然與超類具有「種類」關係,那麼它可能不是一件壞事。

另一個強有力的提示是,當你開始使用指向超類的指針時,因爲你不關心你是在處理一個還是另一個子類。

+0

好帖子!之後我會對此答案投票。我無法確定它們是否涉及,但它們彼此依賴。我也把這兩個課程合併爲一個。我有一個類顯示從屬性列表加載的一系列文本。然後,另一個類將顯示一個特定的精靈/圖片,這些精靈/圖片也會從屬性列表中加載,該屬性列表對應於正在顯示的文本。這兩個類都有兩個方法:loadValueFromPlist和displayNextValue。內部loadValueFromPlist是didPlistLoad,它在完成後會做一些事情。我想創建一個包含這些方法的supercalss。 – EmbodiedDarkness 2012-07-22 18:36:38

+0

我很抱歉雙後,但我達到了最大文本限制。我想命名包含前面列出的三種方法的超類「PropertyLoader」。這兩個類繼承了這一點,並將重寫didPlistLoad來執行一些特定的操作。所有其他方法保持不變。謝謝您的回答。 – EmbodiedDarkness 2012-07-22 18:45:18

+0

來闡明Christian Stiebers的帖子:不要使用繼承來保存代碼行。這是糟糕的設計。這些班級應該有一種「種類」的關係。你的「PropertyLoader」「TextLoader」/「ImageLoader」例子似乎沒問題(imho)。 – 2012-07-23 05:41:06

0

它是一個好習慣,它導致更好的功能組織。另一個原因是你可以看看繼承樹,並知道它與這兩個函數類有關。它沒有太大的傷害。

0
  1. 一般來說,沒有固有的好處或壞處。這很大程度上取決於具體情況。但是,總的來說,你應該總是試圖遵循面向對象的原則。例如,無論您是創建類,無論是抽象類還是具體類,該類都應該同時具有數據行爲。這條規則非常重要,它一路走向了面向對象的基礎。沒有數據的類只是一堆方法(這是程序性編程,而不是OO)。沒有行爲的類是一堆變量(同樣是程序性的,而不是OO)。因此,將數據和行爲結合在一起非常重要。但是,他們應該有彼此的邏輯關係,而不是隨機地放在一起。例如,一種方法應該以某種方式訪問​​數據。

當然,這個規則有偏差。例如,您可能只有一堆靜態類中的方法(如Java中的Math類),或者只是一組Interface中的常量。但是,他們是例外而非規則。爲了方便起見,他們出於必要性。在嚴格的面向對象的意義上,它們不是真正的類。

因此,總是針對正確的原則,只有在沒有其他方式來實現它時纔會偏離,而只是作爲一個例外而非規則。

  1. 上一點是指如何構造一個類。爲了設計班級之間的關係,應該遵循邏輯路徑。仔細考慮你正在處理的每個概念,看看每個概念是否合理,然後看看這些類之間的關係。如果看起來你有三個可以繼承的概念 - 從父類派生的兩個類,那就這樣吧。如果父類有兩種方法,那就OK。即使它有一種方法,它仍然可以。只要它代表一個連貫的邏輯單元。
相關問題