2011-01-14 89 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() { } 

}; 

确保为文本框::油漆和任何其他方法声明为虚基类和析构函数。