Инициализация базового класса для производного базового класса? - PullRequest
0 голосов
/ 14 января 2011

Я не думаю, что это возможно, но если это так, я нахожу это очень полезным.

Я делаю API-интерфейс Gui, где пользователь выполняет событие рисования.Допустим, я хочу сделать Numeric TextBox.Ну, это может показаться хорошей практикой для наследования от TextBox.Проблема в том, что пользователь застревает, чтобы переопределить событие рисования для текстового поля, так как

TextBox::paint();  

просто вызовет мой способ рисования по умолчанию.

Это будет раздражатьесли они должны были поддерживать все свои производные TextBox.

Есть ли способ обойти эту проблему?

Допустим, мой TextBox закрашивает квадрат, тогда числовая часть добавляет круг, нотекстовое поле пользователя, которое выводится из моего TextBox, рисует треугольник, а мое числовое поле выводится из моего TextBox. Я хочу, чтобы результатом был треугольник, круг.

Спасибо

Ответы [ 3 ]

1 голос
/ 14 января 2011

Как я уже сказал в своем комментарии, я думаю, что паттерн моста - это то, что вам нужно, но поскольку вы пытаетесь вставить класс пользователя в качестве базового класса для вашей вещи 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 голосов
/ 14 января 2011

Я не совсем понимаю, что вы имеете в виду.Ваш вопрос не так ясен.

Кажется, заголовок спрашивает, как вызвать инициализатор или конструктор базового класса, это то, что вы хотите?this.

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

  virtual Paint() { }
};

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

};

Убедитесь, что базовый класс для TextBox :: Paint и любых других методов объявлен как виртуальный, так и деструктор.

0 голосов
/ 14 января 2011

Разве единственное отличие между NumericTextBox и TextBox состоит в том, что первый допускает ввод только определенных символов? Хотите покрасить по другому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...