我有一个名为UIElement
的抽象类。它有子类Button
,Checkbox
,List
。
这些子类的构造函数都有Renderer&
参数:
Button(Renderer& renderer) : _renderer(renderer){};
CheckBox(Renderer& renderer) : _renderer(renderer){};
List(Renderer& renderer) : _renderer(renderer){};
我不想将Renderer&
传递给每个子类,因为渲染器对象应该可以通过继承UIElement
来使用这些子类。
我不知道如何在不经过构造函数的情况下给UIElement
Renderer&
。{这可能吗?
编辑:让我们假设代码看起来像这样,所以我们可以继续讨论:
Button(Renderer& renderer) : UIElement(renderer){};
CheckBox(Renderer& renderer) : UIElement(renderer){};
List(Renderer& renderer) : UIElement(renderer){};
答案 0 :(得分:1)
我想你想拥有以下内容。每个儿童班都通过了一次参考。每个(具体的)UIElement
,无论其实际类型如何,都将这样的渲染器存储为引用。要初始化它,您必须有一个UIElement
构造函数来获取(或创建)这样的渲染器。
class UIElement : ... {
UIElement(Renderer &renderer) : _renderer(renderer)
{...}
};
然后,在继承的类中,也在构造函数中采用这样的引用。将此引用传递给基类的构造函数。这很冗长,但你无法解决这个问题。
class Button : class UIElement {
Button(Renderer &renderer) : UIElement(renderer)
{...}
};
简而言之,你无法避免代码中的这种冗长。
但是,这是一件好事:由于您的子类现在具有单独实现的构造函数,因此您可以接受UIElement
的每个子类的特定渲染器:
class Button : class UIElement {
Button(ButtonRenderer &renderer = ButtonRenderer()) : UIElement(renderer)
{...}
};
如您所见,我将构造函数参数设置为默认构造的具体渲染器。因此,在创建Button
的实例时,您可以省略参数。