のは、私は3つの異なるクラスを実装したいとしましょう:スクエア、ColoredSquare、TexturedSquareを。継承の深さ、シングルresponsabilityまたはDRY
ColoredSquareが色とスクエアと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)
{
}
};
、私はそれが許容できる今、私はそれが将来的に実用的であるかもしれないと思っていますを見つけるしながら、(私はポリモーフィズムを使用することはできません)これがSingle Responsability Principleに違反しているのではないかと思います。
この階層構造をきれいに広範囲に実装するにはどうすればよいでしょうか?
私は2段階の継承はどのような手段でも「あまりにも多い」とは感じません。基本クラスが意味のあるオブジェクトであれば、抽象クラスである必要はありません。 – Unimportant
ColouredTexturedSquareがありますか? –
@Aer、私はあなたの最初のコードブロックは、あなたがそれを意味しているとは言えません - 第3のクラス定義(1)は 'TexturedSquare'ではなく、' ColoredSquare'であり、(2) 'Square'ではなく' ColoredSquare'をベースクラスとして使用していますか? –