C ++ - 将成员放在两个子类的共同位置

时间:2016-03-15 10:13:29

标签: c++ class inheritance

让一个包含以下类层次结构的库:

class LuaChunk
{
};

class LuaExpr : public LuaChunk
{
};

class LuaScript : public LuaChunk
{
};

现在我想通过扩展这两个类在我的应用程序中使用这个库:

class AppLuaExpr : public LuaExpr
{
private:

    Foo * someAppSpecificMemberFoo;
    Bar * someAppSpecificMemberBar;
};

class AppLuaScript : public LuaScript
{
private:

    Foo * someAppSpecificMemberFoo;
    Bar * someAppSpecificMemberBar;
};

这里的问题是,如果我有很多成员,每个成员都有自己的getter / setter对,那么它会产生大量的代码重复。

有没有办法,不使用多重继承(我想避免)将AppLuaExprAppLuaExpr中包含的特定于应用程序的内容放在一起?

我已经看过维基百科上列出的现有结构设计模式,但看起来并不适合我的问题。

谢谢。

1 个答案:

答案 0 :(得分:5)

您可以将公共数据表示为自己的类,并在构建期间传递它。这样你就可以使用合成来封装所有内容。

class Core { }; 

class Component { 
    int one, two;
public:
    Component(int one, int two) : one(one), two(two)
    {}
};

class Mobious : public Core 
{
    Component c;
public:
    Mobious(Component &c) : Core(), c(c) { }
};

class Widget : public Core
{
    Component c;
public:
    Widget(Component &c) : Core(), c(c)
    {}
};

int main(void)
{
    Widget w(Component{1, 2});
    Mobious m(Component{2, 3});;
    return 0;
}