2011-01-14 90 views
0

我不認爲這是可能的,但如果是這樣,我會發現它非常有用。將基類初始化爲派生基類?

我正在做桂API,其中用戶做油漆的事件。可以說我想製作一個數字文本框。那麼它從TextBox繼承似乎只是一個好習慣。這裏的問題是,用戶則堅持重新實現對文本框Paint事件,因爲

TextBox::paint(); 

只會叫我拉它的默認方式。

如果他們保持自己的所有文本框的衍生物這將是煩人。

有沒有辦法解決這個問題?假設我的TextBox繪製一個正方形,然後數字部分添加一個圓圈,但用戶的文本框從我的TextBox派生出一個三角形,而我的數字一個從我的TextBox派生出來,我希望結果是三角形,圈。

感謝

+0

你的問題是不完全清楚,但它幾乎聽起來像你需要在這裏適用的橋模式的一些變種。 – 2011-01-14 05:46:46

回答

1

正如我在我的評論說,我覺得橋模式實際上是你想要的,但因爲你是試圖插入用戶的類作爲您NumericField事情,你會做這樣一個基類,是:

template < typename Base = TextField > 
struct NumericField : Base 
{ 
... 
    void paint() { Base::paint(); draw_circle(); } 
}; 

現在,用戶可以使用NumericField<>或者他們可以插入自己的等級:

struct UserField : TextField 
{ 
    ... 
    void paint() { draw_triangle(); } 
}; 
NumericField<UserField> my_field; 

橋答案看起來會像這樣:

struct TextField 
{ 
    TextField() : extender_(new null_extender) {} 
    ... 
    void set_extender(extender*); 
    virtual void paint() { draw_square(); extender_->paint(); } 
    ... 
}; 

struct extender { virtual void paint() = 0; }; 
struct null_extender { void paint() {}}; 
struct numeric_extender { void paint() { draw_circle(); }}; 

struct UserField 
{ 
    void paint() { draw_triangle(); extender()->paint(); } 
}; 

很多細節都沒有提到,但那就是故事。

0

是不是NumericTextBox和文本框之間的唯一區別在於,前者只允許某些字符的輸入?你想要繪製不同的畫嗎?

+0

重點是它不會用戶的用戶的繪畫事件,theyd需要能夠做到:public UserTextBox – jmasterx 2011-01-14 05:09:38

+0

你是什麼意思? UserTextBox從哪裏來?這是用戶創建的實例的名稱嗎?如果這是他想要的,用戶創建一個NumericTextBox,並且就像它是一個TextBox一樣使用它。如果他們聲明它爲一個TextBox,但實例化一個NumericTextBox,它將正常工作,因爲繪畫在任何合理的API中都是虛擬的。 – 2011-01-14 05:15:38

0

我不太確定你的意思。你的問題不太清楚。

標題好像是問如何調用基類初始化或構造, 是你想要的嗎?

如果這是你想要的東西,然後就這樣。

class TextBox 
{ 
    public: 
    TextBox() { } 
    virtual ~TextBox() { } 

    virtual Paint() { } 
}; 

class NumericTextBox : public TextBox 
{ 
    public: 
    NumericTextBox() : TextBox() { } 
    ~NumericTextBox() { } 

}; 

確保爲文本框::油漆和任何其他方法聲明爲虛基類和析構函數。