c++ - 如何解决由继承和嵌套类引起的这种冗余?

标签 c++ inheritance inner-classes

我有 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.
}

呃哦,这是多余的。我们已经在基类 Widget 中定义了 m_settings,但我不想在所有派生类中使用它(例如 SpecialWidget) .我不能在基类中将 m_settings 设为私有(private),因为我想在 LimitedWidget 中使用该对象。但我不想要 2 个设置对象,其中一个在 SpecialWidget 中是无用的。

有解决办法吗?

感谢您的宝贵时间。

最佳答案

你可以尝试这样的事情:

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 方法中创建默认设置,您的特殊小部件覆盖它,创建特殊设置。

关于c++ - 如何解决由继承和嵌套类引起的这种冗余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56063575/

相关文章:

C++成员函数虚覆盖和同时重载

C++具体继承示例

c++ - arduino fio v3,GPS NMEA读取错误,疯狂输出

c++ - num_get facet 和 stringstream 转换为 bool 值 - 初始化 bool 值失败?

c++ - 我正在使用命令提示符在 C++ 中做一个非常简单的应用程序

c# - Base Base Constructor C# 初始化

c++ - 在 OSX Lion 上使用 g++ 的 SDL

java - 我可以从内部类访问注入(inject)的 ejb 吗?

java.lang.NoClassDefFoundError : in anonymous inner class 错误

java - Java 中嵌套类中的静态成员