如何解决继承和嵌套 class 导致的这种冗余?
How can I resolve this redundancy caused by inheritance and nested class?
我有 2 个派生的 classes,在其中一个 classes 中,我想自定义基础中的嵌套 class 的实现。另一方面,我只想使用基础对象。
我遇到了一个可以用下面的例子演示的问题:
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.
}
呃哦,这是多余的。我们已经在基础 class Widget
中定义了 m_settings
,但我不想在所有派生的 class 中使用它(例如 SpecialWidget
) .我无法在基 class 中将 m_settings
设为私有,因为我想在 LimitedWidget
中使用该对象。但是我不想要 SpecialWidget
中的 2 个设置对象,其中一个是无用的。
有解决办法吗?
感谢您的宝贵时间。
您可以尝试这样的操作:
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
换句话说,基础 class 在 initialize
方法中创建默认设置,您的特殊小部件会覆盖它,创建特殊设置。
我有 2 个派生的 classes,在其中一个 classes 中,我想自定义基础中的嵌套 class 的实现。另一方面,我只想使用基础对象。
我遇到了一个可以用下面的例子演示的问题:
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.
}
呃哦,这是多余的。我们已经在基础 class Widget
中定义了 m_settings
,但我不想在所有派生的 class 中使用它(例如 SpecialWidget
) .我无法在基 class 中将 m_settings
设为私有,因为我想在 LimitedWidget
中使用该对象。但是我不想要 SpecialWidget
中的 2 个设置对象,其中一个是无用的。
有解决办法吗?
感谢您的宝贵时间。
您可以尝试这样的操作:
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
换句话说,基础 class 在 initialize
方法中创建默认设置,您的特殊小部件会覆盖它,创建特殊设置。