如何为虚拟方法提供实现框架?

时间:2013-08-15 06:38:41

标签: c++ design-patterns

例如,我有一个带有虚方法的抽象类

class A
{
public:
    virtual void setColumn(int i, string s); // set column i to show string s
    ...
};

该类由其他一些抽象类派生,如BC

我发现A的大部分对象都遵循以下规则:它有2列:名称和描述。为了避免重复代码(实际情况更复杂,所以我想避免重复),我在A中添加了2个虚拟方法,因为混凝土类具有setName()和{{setDescription()的不同实现1}}。

class A
{
public:
    virtual void setColumn(int i, string s)
    {
        if (i == 0)
            return setName(s);

        if (i == 1)
            return setDescription(s);
    }

    virtual void setName(string s);

    virtual void setDescription(string s);

    ...
};

因此,如果具体类遵循规则,用户只需要重新实现setName()setDescription()。如果没有,他们需要重新实施setColumn()。但是,3个虚拟对象(setName()setDescription()实现setColumn())让我觉得设计有问题。有什么好的设计吗?

2 个答案:

答案 0 :(得分:2)

我在这里看不到任何抽象。

除非有与该问题相关的特定要求,否则只需在基类中定义一个public容器。

struct A {
    std::vector< std::string > columns;

    enum columnIndex {
        name = 0,
        description = 1,
        numCols
    };

    A() : columns( numCols ) {}
};

A foo;
foo.columns[ A::name ] = "Fido";

在C ++中添加更多样板文件通常不会为您提供更安全,更易于维护的程序。

答案 1 :(得分:1)

我认为你应该把它减少到两个层次:

class IHasColumns
{
public:
    virtual void setColumn(int columnIndex, std::string value) =  0;
};

class IHasNameDescription : public IHasColumns
{
public:
    virtual void setName(std::string name) = 0;
    virtual void setDescription(std::string name) = 0;

private:
    // Override
    void setColumn(int columnIndex, std::string value)
    {
        if (i == 0)
            return setName(value);

        if (i == 1)
            return setDescription(value);
    }
};