1

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

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

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

我发现 A 的大多数对象都遵循规则:它有 2 列:名称和描述。为了避免重复代码(实际情况更复杂,所以我想避免重复),我添加了另外 2 个虚拟方法,因为具体类对和A有不同的实现。setName()setDescription()

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())让我觉得设计有一些问题。有什么好的设计吗?

4

2 回答 2

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++ 中添加更多样板文件通常不会让您获得更安全、更可维护的程序。

于 2013-08-15T06:51:22.123 回答
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);
    }
};
于 2013-08-15T06:51:30.157 回答