Как я могу устранить эту избыточность, вызванную наследованием и вложенным классом? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть 2 производных класса, в одном из этих классов я хочу настроить реализацию вложенного класса, который находится в базе. В другом я просто хочу использовать базовый объект.

Я столкнулся с проблемой, которую можно продемонстрировать на следующем примере:

class Widget
{
public:
    class Settings
    {
        // ...
    }

// ...

protected:
    Settings m_settings;
}

// -------------------------------------------------------

class LimitedWidget : public Widget
{
    // ...

    // the settings are the same, so using base m_settings object.
}

// -------------------------------------------------------

class SpecialWidget : public Widget
{
public:
    class Settings : public Widget::Settings
    {
        // customize the settings for SpecialWidget
    }

// ...

protected:
    Settings m_settings; // now I must declare another m_settings object.
}

О, это избыточно. Мы уже определили m_settings в нашем базовом классе Widget, но я не хочу использовать это во всех производных классах (например, SpecialWidget). Я не могу сделать m_settings закрытым в базовом классе, потому что я хочу использовать этот объект в LimitedWidget. Но я не хочу 2 объекта настроек, один из которых бесполезен, в SpecialWidget.

Есть ли решение?

Спасибо, что уделили время.

1 Ответ

2 голосов
/ 09 мая 2019

Вы можете попробовать что-то вроде этого:

class Widget
{
  ...

  protected:
    Settings* m_settings;

  public:

    void initialize()
    {
      m_settings = createSettings();
    }

  protected:

    virtual Settings* createSettings()
    {
      return new Settings();
    }

  ...

} // class Widget

А затем:

class SpecialWidget: public Widget
{
  public:

    class SpecialSettings: public Settings
    {
        // customize the settings for SpecialWidget
    }

  protected:

    Settings* createSettings()
    {
      return new SpecialSettings();
    }

} // class SpecialWidget

Другими словами, базовый класс создает настройки по умолчанию в методе initialize испециальный виджет отменяет это, создавая специальные настройки.

...