2016-04-25 51 views
1

比方說,我想實現三個不同的類別:廣場ColoredSquareTexturedSquare繼承深度,單責任或幹

由於ColoredSquare廣場有彩色和TexturedSquareColoredSquare有質感,我首先想到的是讓他們從對方獲得:

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

我不覺得2級繼承是「太多」的任何手段。如果基類本身是一個有意義的對象,它不一定是抽象的imo。 – Unimportant

+0

會不會有ColouredTexturedSquare? –

+0

@Aer,我想你的第一個代碼塊並沒有說明你的意思 - 不是第三類定義(1)的意思是「TexturedSquare」而不是「ColoredSquare」,(2)意味着'ColoredSquare'而不是'Square'作爲基類? –

回答

1

我不認爲這個問題有一個正確的答案,但還有其他方法可用。

之一可能是乘從純虛類繼承,並實現他們在派生類中:

class Texture {}; 
class Color {}; 
class Square {}; 

class ITextured { public: virtual void setTexture(Texture) = 0; }; 
class IColored { public: virtual void setColor(Color) = 0; }; 

class ColoredSquare : public IColored, public ITextured, public Square { 
    Texture tex; 
    Color col; 
public: 
    virtual void setTexture(Texture t) { tex = t; } 
    virtual void setColor(Color c) { col = c; } 
}; 

這就避免了像RectangleSquare繼承有問題儘管矩形方法可能會改變只有高度,使派生正方形課程違反方方面面。

Composition是另一種方法,並且有許多實現類似想法的方法。

+0

哦,這很有趣。我沒有想到這一點。它確實解決了我能想到的問題。 現在,你提到'Composition',在這裏,它與你的解決方案非常相似,除了繼承它只是作爲一個成員,對吧? – Aer

+0

[這裏是一個沒有使用任何繼承的例子](https://ideone.com/qcnICT) – maxlazar