2011-07-21 119 views
5

我正在寫一個大的抽象基類,有30個純虛擬方法*。大抽象基類

找到所有功能在實現類的基類來實現是有點乏味,主要是因爲MSVC++不告訴你哪個函數失敗,編譯器錯誤實行「不能構造抽象類」

所以,我想知道是我的大型抽象基類是一個壞主意,或者我應該將它分成幾個接口,或者是否有編譯器警告我可以激活它會告訴我哪個方法我沒有提供實現..或者這只是抽象類編碼的一部分,我應該習慣它。

*它所做的是在幾個不同的渲染子系統之間提供一層通用功能。

+2

我的MSVC確實告訴我哪些函數是抽象的。 – Puppy

+1

如果您可以劃分界面以清除組件,請執行此操作。我不會聲稱這有一個合理的理由,但我認爲這顯然是一件好事。 –

回答

4

有沒有明顯的正確回答這個問題。決定是否分開因素的基礎類分爲多個抽象基類大概應該是你根據與否的基類邏輯代表幾個不同的概念,而不是可憐的編譯器錯誤消息的決定。如果你這樣做的唯一原因是編譯器錯誤信息,你可能想檢查一下,看看你是否可以升級編譯器,或者是否有其他原因來做這件事。大多數現代編譯器應該提供非常好的,詳細的錯誤。

拆分接口成片可能是一個好主意,如果你的設計暗示你可能真的想有實現只是小片的基類的多個不同類。如果您希望這樣做,將界面分開可能是有利的。不過,你會看到一些增加的複雜性。例如,如果一個接口類型的指針指向實現多個接口的對象,則可能需要進行某種交叉轉換才能獲得正確的類型,否則您可能不得不引入一個新的抽象類來表示繼承來自所有不同的接口類型。接口類的多重繼承可能會導致一些名稱衝突,但如果接口設計正確,這通常不會成爲問題。

總之,我強烈建議不要這樣做,因爲編譯器錯誤的原因,但如果你認爲這是一個很好的設計決定,那麼一定要去做它。現在編譯器已經足夠好,你很少(但不是永遠不需要)圍繞它們構建你的設計。

4

在我看來,接口類本質上是不好的,但是構成的問題使得這個特定的應用程序聽起來很可疑。

如果您有從這個接口派生類,目前還不清楚到底是什麼功能,你需要重寫,這似乎表明,所有這些功能可能沒有必要。

當你打造一個抽象基類,純虛函數的數量並不重要(對我來說),但它應該清楚爲什麼每次從這個接口派生的類必須實現每個純虛函數。如果你發現自己在思考「爲什麼我必須實現這個功能?」,將抽象類分成幾個不同的接口可能是合適的。

+2

最後一款確實在這裏討論了這個問題的內涵。 –

0

反正這麼大的班級是一個爛攤子,神級antipatern。使用聚合/合成來分解一個類,並看看SOLID開發原則,看起來像單個類的30個方法不遵循單一責任原則,至少......所以我會推薦重新考慮一個類的設計。祝你好運!

0

通常,在錯誤「無法實例化抽象類」(在所調用的線路上拋出該錯誤)後,如果在編寫實現之前將接口複製並粘貼到類中,則會出現鏈接器錯誤指向您忘記實施的方法的「未解決的外部錯誤」。