继承深度,单一责任或DRY

时间:2016-04-25 22:42:07

标签: c++ inheritance

我想说我想要实现三个不同的类: Square ColoredSquare TexturedSquare

由于 ColoredSquare 是带有颜色的 Square TexturedSquare 是带有纹理的 ColoredSquare ,我的第一个我们的想法是让它们彼此相互衍生:

class Square {
    Square::Square(position)
        : position_(position)
    {
    }
}

class ColoredSquare : public Square {
    ColoredSquare::ColoredSquare(position, color)
        : Square(position), color_(color)
    {
    }
}

class TexturedSquare: public ColoredSquare {
    TexturedSquare::TexturedSquare(position, color, texture)
        : ColoredSquare(position, color), texture_(texture)
    {
    }
};

但是,我记得读过太多继承深度是不好的做法(通常,类应该只来自抽象类)。 所以我想改用一个类:

    class Square {
    Square::Square(glm::vec3 position)
        : position_(position), type_(SquareType::Basic)
    {
    }

    Square::Square(glm::vec3 position, glm::vec4 color)
        : position_(position), color_(color), type_(SquareType::Colored)
    {
    }

    Square::Square(glm::vec3 position, glm::vec4 color, glm::vec2 texture)
        : position_(position), color_(color), texture_(texture), type_(SquareType::Textured)
    {
    }
};

现在,虽然我觉得现在可以接受,但我认为将来可能不实用(我不能使用多态),我也想知道这是不是违反单一责任原则。

以干净,广泛的方式实施此层次结构的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为这个问题没有一个正确答案,但还有其他方法可供使用。

可以是从纯虚拟类中多次继承并在派生类中实现它们:

Square

这可以避免像Rectangle这样的问题从{{1}}继承,尽管Rectangle方法可能只会改变高度,导致派生的方形类违反平方。

Composition是另一种方法,有很多方法可以实现类似的想法。