Содействие повторному использованию кода в этой ситуации - PullRequest
0 голосов
/ 09 декабря 2010

Это немного сложно объяснить, но я сделаю все возможное, чтобы объяснить это.

Я создаю Gui API для игр, и у него есть Темы.

Сначала яобъясните, как работают виджеты.

Кнопка, например, наследуется от виджета.Темы работают аналогично.

ButtonTheme наследуется от WidgetTheme.

Внутри каждого класса виджетов есть экземпляр соответствующей ему Темы.

Класс виджетов имеет:

    private:
   static WidgetTheme widgetTheme;
    public:
   static WidgetTheme& getWidgetTheme();

класс кнопок имеет:

  private:
    static ButtonTheme buttonTheme;
    public:
   static ButtonTheme& getButtonTheme();

конструктор Widget, строит себя из своей темы, например:

Widget()
{
   setFont(getWidgetTheme().getFont());
}

Button, унаследованный от WidgetTheme, должен делать то же самоепотому что внутренний виджет не будет знать, как создать из ButtonTheme, поэтому моя кнопка в конечном итоге должна сделать:

Button()
{
   setFont(getButtonTheme().getFont());
   setButtonPadding(getButtonTheme().getButtonPadding());
}

Вот где моя проблема.Это действительно неправильно, что я должен восстановить все WidgetTheme и перенаправить их на параметры ButtonTheme для Widget.Если я этого не сделаю, SuperButton унаследует стили Button, которые также унаследуют стили Widget, но я хочу, чтобы SuperButton использовал свои версии ButtonTheme и WidgetTheme, потому что SuperButtonTheme наследовал бы от ButtonTheme и WidgetTheme.

Есть ли способ, которым я мог бы изменить это так, чтобы конструктор должен был только установить части темы, которую он приносит, и не должен устанавливать те из своих родителей?

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Виртуальный getTheme() (как предполагает Дрюш), но использование ковариантных типов возврата должно решить вашу проблему, не требуя приведения.

1 голос
/ 09 декабря 2010

Конструктор Widget может принять WidgetTheme и использовать его.

Widget(const WidgetTheme& theme)
{
   setFont(theme.getFont());
}

Button() : Widget(getButtonTheme())
{
   setButtonPadding(getButtonTheme().getButtonPadding());
}
0 голосов
/ 09 декабря 2010

Я не совсем понимаю, где getButtonTheme () и getWidgetTheme () живут в вашей иерархии объектов, но кажется, что класс должен знать, что это за тема, так почему бы не использовать метод getTheme ()твой класс?Может быть, я слишком привык к языкам сценариев и не ценил некоторые проблемы со строгой типизацией.

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