Demo Code
#if 0
class Color{
public:
string m_name;
};
class Black : public Color{
public:
Black(){
m_name = "Black";
}
};
class White : public Color{
public:
White(){
m_name = "White";
}
};
class Sofa{
public:
string m_name;
};
class LeatherSofaBlack : public Sofa{
Black m_color;
public:
LeatherSofaBlack(){
m_name = "LeatherSofa " + m_color.m_name;
}
};
class LeatherSofaWhite : public Sofa{
White m_color;
public:
LeatherSofaWhite(){
m_name = "LeatherSofa " + m_color.m_name;
}
};
class ClothSofaBlack : public Sofa{
Black m_color;
public:
ClothSofaBlack(){
m_name = "ClothSofa " + m_color.m_name;
}
};
class ClothSofaWhite : public Sofa{
White m_color;
public:
ClothSofaWhite(){
m_name = "ClothSofa " + m_color.m_name;
}
};
class House{
LeatherSofaBlack m_sofa;
public:
void display(){
cout << "I have a " << m_sofa.m_name.c_str() << endl;
}
};
#else
class Color{
public:
string m_name;
};
class Black : public Color{
public:
Black(){
m_name = "Black";
}
};
class White : public Color{
public:
White(){
m_name = "White";
}
};
class Sofa{
public:
string m_name;
};
class LeatherSofa : public Sofa{
public:
LeatherSofa(){
m_name = "LeatherSofa";
}
};
class ClothSofa : public Sofa{
public:
ClothSofa(){
m_name = "ClothSofa";
}
};
class House{
LeatherSofa m_sofa;
White m_sofa_color;
public:
void display(){
cout << "I have a " << m_sofa.m_name.c_str() \
<< " " << m_sofa_color.m_name.c_str() << endl;
}
};
#endif
void test_main_bridge(void){
House h;
h.display();
}
Demo Result
I have a LeatherSofa White
Summary
Point1 這裏可以想象如果兩個類存在的依賴關係,被依賴的類的變動必然導致另一個類需要做對應的調整
Point2 請將類定義得儘量單純,將關聯工作交給真正需要盡力依賴關係的類