类设计:类成员继承自同一个基类

Posted

技术标签:

【中文标题】类设计:类成员继承自同一个基类【英文标题】:Class design: Class member inherits from the same base class 【发布时间】:2017-08-30 10:19:09 【问题描述】:

我正在为以下情况考虑适当的类设计:假设我想创建一个类似于(数学)函数的类设计。所有函数都派生自基类Function。现在可以想到一个函数FuncB,它是FuncA 的多个对象的总和。就我而言,FuncBFuncA 是相当复杂的对象,但我目前的实现归结为:

class Function

    virtual double value() = 0;
;

class FuncA : public Function

public:
    virtual double value() return v;
private:
    double v;
;

class FuncB : public Function

    virtual double value() 
        double result = 0;
        for( auto i : v)
            result += i.value();
        return result;
    
private:
    std::vector<DerivedA> v;
;

不知何故,我认为这是一个糟糕的类设计,因为FuncB 有一个成员继承自与类本身相同的基类。有什么建议可以更优雅地解决这个问题吗?

【问题讨论】:

这就是复合设计模式……相当有名 std::vector&lt;Function*&gt; v; 会更有用 Somehow I would consider this as a bad class design since FuncB has a member which inherits from the same base class as the class itself. 为什么? 它是否必须在运行时可重新配置,或者您是否在编译时知道您想要拥有哪些功能? @molbdnilo 使用accumulate 必须是return std::accumulate(v.begin(), v.end(), 0.0, [](double result, const auto&amp; f) return result + f.value(); );。我想我更喜欢 OP 的代码。 【参考方案1】:

复合设计模式

class ContainerOfX : public X 
    typedef X* bestType;
    // maybe...
    // typedef std::shared_ptr<X> bestType;


    ...

    std::vector< bestType > subTypes;
;

它允许您创建一个绘图系统 - 可以将不同形状的复合对象视为一个集合

obj->draw(); // draw house from various lines and boxes.

它允许您为执行/撤消逻辑创建一个简单的脚本。

【讨论】:

以上是关于类设计:类成员继承自同一个基类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 继承

当我们复制/分配派生类对象时,如何在继承中复制基类成员?

C++继承

将成员添加到从基类继承的结构

python2学习------基础语法2(类类的继承类成员函数防御式编程)

c#核心基础--类的继承