2012-09-09 87 views
1

實施例:用純虛擬覆蓋虛擬..是否可以?

class IGui{ 
    protected: 
    virtual bool OnClicked(){return false;} 
    virtual bool OnHover(){return false;} 
    virtual bool OnScrollBarChange(){return false;} 
    virtual bool OnTextChange(){return false;} 

    ... 

} 

class IGuiButton: public IGui{ 
    protected: 

    virtual bool OnClicked() = 0; 
    virtual bool OnHover(){ 
    do stuff 
    return true;} 
    ... 
} 

的要點是具有用於所有的GUI類型一個黎民接口,可以是(其中,不是所有的虛函數需要重寫),然後提供一個按鈕精簡版專業化,但爲按鈕,theres必須是OnClicked的替代..

此外,我認爲我應該讓一個按鈕不應該重寫私人(所以使用私有繼承,並使用該花哨的「使用Base :: Method;」爲使具體的保護?

+0

你可以試試看,或者你問這是否是一個好設計? – John3136

+0

@ John3136,是的,我在尋找建議,我有點習慣於搗毀我的實施選擇。 – Icebone1000

+0

通用接口的用例是什麼? – razeh

回答

5

問題有多個方面。第一個實際上是一個相當有趣的問題:

派生類可以有一個純粹的虛方法,在基地不純?

答案是肯定的,就可以了。與預期的(如果你期望這個工作)語義:從中間類型派生的類型必須實現虛函數不是一個抽象類型。這導致了一個奇怪的情況,基地不抽象,但派生類型是...這將是令人驚訝的。爲此,我會在設計中避免這種情況。

如果您標記爲private派生類型的成員不應該重寫?

不,這樣做沒有任何理由或優勢。成員函數是否爲publicprotectedprivate派生類可以覆蓋它。任何可以通過基類型調用函數的代碼仍然可以通過強制轉換爲基類來調用它。這導致了另一個奇怪的在你的設計中的東西。基類填充了protected虛函數,這意味着它們只能由派生類型訪問。這沒有定義一個接口,因此不能這樣使用。如果一個函數/類需要引用一個IGuiIGuiButton,那麼它就不會有太多的工作,因爲沒有公共接口。這基本上意味着沒有人能夠調用任何事件 - 不管你是否也在濫用友誼來提供對事件處理程序的訪問,但是你應該避免它。

那麼什麼是正確的設計?

有多種選擇。我建議在創建自己的方形車輪之前,先看看過去發明的車輪:查看不同的圖形框架和庫,並試圖理解他們爲什麼決定設計它們。查看差異並嘗試確定它們帶來的優勢/劣勢以及哪個選項與您的問題相符。用戶界面是一個有很多現有技術的領域,你可能不會從頭開始設計比過去人們做得更好的東西 - 你可能會這樣做,但它更容易落入其他人都覺得同樣的陷阱。

0

我不得不說我認爲你想要做的是設計不佳。

您的最高等級(IGui)「擁有一切」,然後當您沿着類層次結構向下移動時,您可以有效地帶出東西。頂層通常會有常見的東西,並且在下移時添加差異。

您正在失去一個好的設計可以給你的保護。

+0

問題是,實際處理gui事件的方法(不是我的)在一次函數調用中處理所有的事情,它只是給你什麼類型的數據以及gui ID。這很糟糕,導致它不是面向對象。我試圖做的是通過給中心類別分離gui對象和行爲來創建一個更加模塊化的GUI東西。 – Icebone1000

+0

更多關於我做出的選擇,我在IGui類上的想法確實爲所有可以存在的gui元素創建了一個接口,而不是真正的基類。它並不全是純粹的,因爲一個元素不會使用任何東西。 – Icebone1000