2011-02-23 159 views
0

設計桌子與木材或鋼材料。我有以下設計,這更好,爲什麼?或者有更好的建議設計?OO設計,桌子設計

設計1:

class Meterial{ 
public: 
    void virtual info()=0; 
}; 

class Wood:public Meterial{ 
public: 
    void info(); 
}; 

void Wood::info(){ 
    cout<<"wood"<< " "; 
} 

class Steel:public Meterial{ 
public: 
    void info(); 
}; 

void Steel::info(){ 
    cout<<"steel"<< " "; 
} 




class Furniture{ 
    void virtual info()=0; 
}; 

class Table:public Furniture{ 
private: 
    Meterial * _meterial; 
public: 
    Table(Meterial * m); 
    void info(); 
}; 

Table::Table(Meterial * m){ 
    _meterial= m; 
} 


void Table::info(){ 
    _meterial->info(); 
    cout<< " table " << endl; 
} 

int main(){ 
    Table * wood_table=new Table(new Wood()); 
    Table * steel_table=new Table(new Steel()); 
    wood_table->info(); 
    steel_table->info(); 
} 

設計2:

class Meterial{ 
public: 
    virtual void info()=0; 
}; 

class Wood:public Meterial{ 
public: 
    void info(); 
}; 

void Wood::info(){ 
    cout<<" wood " << " "; 
} 

class Steel:public Meterial{ 
public: 
    void info(); 
}; 

void Steel::info(){ 
    cout<<" Steel " << " "; 
} 



class Furniture{ 
public: 
    virtual void info()=0; 
}; 

class Table:public Furniture{ 
public: 
    void info(); 
}; 

void Table::info(){ 
    cout<<" table "<< endl; 
} 

class WoodTable:public Wood,public Table{ 
public: 
    void info(); 
}; 

void WoodTable::info(){ 
    Wood::info(); 
    Table::info(); 
} 


class SteelTable:public Steel,public Table{ 
public: 
    void info(); 
}; 

void SteelTable::info(){ 
    Steel::info(); 
    Table::info(); 
} 



int main(){ 
    WoodTable *woodTable = new WoodTable(); 
    SteelTable *steelTable = new SteelTable(); 

    woodTable->info(); 
    steelTable->info(); 
} 

的感謝!

+3

表格的形式根據所做的不同而不同?否則,你的工作太多了。 'enum Material {Wood,Steel};' – 2011-02-23 23:02:48

回答

3

當你有一個非常特殊的理由,或當所有其他選項是不是更好,也不更壞時,才應使用繼承。永遠不要繼續重複使用。

材料是否有任何行爲可以動態改變?桌子的材料可以在運行時改變嗎?如果答案是肯定的,那麼你可能需要運行時多態性和繼承。你的第一個設計是朝着正確方向邁出的一大步。然而,你的第二個設計是有風險的,並沒有帶來什麼好處(並且赦免雙關語)。多重繼承?爲什麼?你應該有一個非常具體,堅實的理由來使用多重繼承。

另一個設計選擇是使用編譯時的多態性。

struct wood { }; 
struct steel { }; 

template<class M> 
struct table { }; 

// ... 
table<wood> wood_table; 
1

想想之間的差異「是」和「有」。一個表一個材質屬性,一個表本身不是材質。我會選擇第一個。

+0

但是,木桌不是一張桌子形狀的木頭嗎?這塊木頭在桌子形狀之前就存在了,之後就會存在,所以「桌子形」必定是一種財產,對吧?即使是一個可變的:使用合適的工具,您可以保留相同的木製物體,但可以賦予其不同的形狀。 – Niki 2011-02-23 23:08:11

+2

,一旦你有一個木製邊框和鋼腿:) – 2011-02-23 23:16:38

+0

@nikie玻璃平頂表幾乎倒了:它是木製的*一塊*,但表是不是物質,它是一個獨立的物理對象。這些設計中的木材是材料,表格不是材料,所以表格不能是木材。如果伍德的設計意思是PieceOfWood,那麼也許你可以考慮一張桌子也是木材。當然通常是幾件。 – 2011-02-24 02:31:01