2016-11-08 93 views
0

我有有多個標籤的TabControl一個WinForms形式。我通過向每個標籤頁添加用戶控件來實現標籤頁的功能。這使我能夠將功能分爲每個頁面的類,而不是面對巨大Form類的問題。強制派生類實現一個給定的方法

此外,我已經定義了一個標籤頁基類來應用參數提供通用功能和引用。因此,繼承是UserControl - > PagesBase - > MyPage1(MyPage2等)。提供的PagesBase不是抽象的,這一切運作良好。我可以在VS2012中正常設計單個頁面。

不過,我想強制每個頁面來實現的方法和屬性小(通用)集。首先想到的是使用抽象的PagesBase類。不幸的是,VS中的單個頁面設計者不會啓動,抱怨他們需要創建PagesBase的一個實例。

下一個念頭,就是一個接口適用於PagesBase。但是這不起作用,因爲它會強制PagesBase定義所有常用方法等,並且它們隨後可用於派生的MyPageN類,而不必定義它們自己的方法。接口不會讓它們在基類中被定義爲私有的。如果頁面調用的基類方法沒有被覆蓋(沒有編譯時警告),那麼期望任何人都可以添加一個頁面直接從一個通用接口派生(但不能強制執行此操作)或引發運行時異常)。

我錯過了一些明顯的東西嗎?有什麼想法嗎?

+0

您是否嘗試過純虛擬方法? –

+1

您可以在PagesBase中將您的方法聲明爲virtual,並且在chile pages類中未覆蓋方法的情況下,會在內部拋出異常以獲取運行時異常。 –

+0

@ThomasMatthews:是的,他有:當他說「使用抽象的PagesBase類」時,他就是這麼做的。問題在於Visual Studio GUI設計者想要創建一個「PagesBase」對象,而不能。 –

回答

0

通常情況下,一個抽象的PagesBase類(帶有純虛函數)將是一個很好的途徑,除非它對錶單設計器(注意我不知道設計器是如何工作的)看起來不太合適。

你可以做的是你的類分成兩個部分:

  • 你PagesBase類將是沒有純虛函數的具體類。
  • PagesBase將持有指向MyPageIntf的指針。
  • MyPageIntf將是一個定義您的頁面接口的抽象類。
  • MyPage1,MyPage2等將從MyPageIntf導出。
  • 您可以使用MyPageIntf接口在PagesBase中實現函數。
  • 如果設計師要求的任何函數(您實現並採用MyPageIntf接口),那麼爲了防止nullptr崩潰,在你PagesBase構造函數,你需要將MyPageIntf指針設置爲提供某種默認的對象接口的實現。當運行應用程序(而不是在設計器中運行)時,您將用真實實現(即MyPage1/MyPage2 /等)替換它。
0

您是否嘗試添加默認構造函數(無參數)到你的PagesBase類?這可能是設計師爲了呈現而期待的。

相關問題