假設我有一個父類class Parent
和兩種類型的子對象class Son
和class Daughter
。這是常見的Son
和Daughter
屬性在Parent
C++共享子對象之間的父屬性
定義現在我定義的Son
一個實例和Daughter
之一。他們有不同的 方法,可以做不同的事情,但當Son
做些什麼,Daughter
等待(和相互)。 Son
或Daughter
的行爲是 重新定義Parent
中的一些屬性, 兩個孩子都應該考慮到這些屬性。
實現了最初的想法是這些屬性設置爲static
所以如果 Daughter
改變的東西,它也會影響Son
。但我的問題是, 它會影響所有Son
和Daughter
的實例,我只想影響 那些在同一個「家庭」。
這裏是暴露我的問題一個僞代碼:
class Parent{
public:
/*define some constructors and parent stuff*/
void set_family_name(std::string f){ family_name = f; }
protected:
std::string family_name;
}
class Son : public Parent{
public:
/*define some constructors and son stuff*/
}
class Daughter : public Parent{
public:
/*define some constructors and daughter stuff*/
}
int main(){
Son JohnSmith(/*some attributes*/);
Daughter AnnaSmith(/*some attributes*/);
Son BobWeston(/*some attributes*/);
JohnSmith.set_family_name("Smith"); /*should also affect AnnaSmith but not BobWeston*/
}
是否有連接子的兩個實例的方式,這樣,當一個改變 父參數將反映在另一個但不是在他們全部 ?
我想到的第一個解決方案是設置一些其他類, class FamilyAttribute
將在Parent
中引用。喜歡的東西:
class FamilyAttribute{
public:
/*define some constructors and family stuff*/
void set_family_name(std::string f){ family_name = f; }
private:
std::string family_name;
}
class Parent{
public:
/*define some constructors and parent stuff*/
void set_family_name(std::string f){ attribute->set_family_name(f); }
protected:
FamilyAttribute* attribute;
}
但是,這將讓我重寫所有的方法,這也將成倍的數量 的方法的調用。這也似乎很奇怪,因爲現在Parent
只有 多態性(我需要)。
有沒有更好的方法?
這聽起來像是一個可怕的混亂的層次結構,違反了Liskov替代原則。你是否真的試圖模仿家庭關係,比如父母/孩子,還是你只是用一個可怕的比喻來描述你真正的問題?有了這個模型一個兒子IS-A家長,這似乎是錯誤的。 –
@JonathanWakely糟糕的例子,我的壞!對不起(可以用親屬取代父母:-)) – PinkFloyd
這是一個可怕的例子,因爲你以兩種不同的方式使用「父母」和「孩子」,一種是普通的面向對象的「父類」和「子類」術語我討厭它,它會引起誤解,最好談論基類和派生類),另一種方式是在談論人類家庭關係。 –