我想说我想要实现三个不同的类: 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)
{
}
};
现在,虽然我觉得现在可以接受,但我认为将来可能不实用(我不能使用多态),我也想知道这是不是违反单一责任原则。
以干净,广泛的方式实施此层次结构的最佳方法是什么?
答案 0 :(得分:1)
我认为这个问题没有一个正确答案,但还有其他方法可供使用。
可以是从纯虚拟类中多次继承并在派生类中实现它们:
Square
这可以避免像Rectangle
这样的问题从{{1}}继承,尽管Rectangle方法可能只会改变高度,导致派生的方形类违反平方。
Composition是另一种方法,有很多方法可以实现类似的想法。