1

たとえば、仮想メソッドを持つ抽象クラスがあります

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

Bこのクラスは、 や などの他の抽象クラスから派生していCます。

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

これを 2 つのレベルにカットする必要があると思います。

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 に答える