2012-08-14 25 views
3

我想知道這是這個問題的更好的方式繼承:哪一個更好,指向其他類或從該類

老師可以教多個科目,也可以採取更比實驗室或可都在一個研究所。 Lab,Subject,Teacher也有一些其他變量。我沒有把它們寫在這裏。 新lab,subject and teacher可以單獨添加。當添加教師時,我只輸入Teacher classlabCodesubCode的所有變量。有一些實驗室和主題是預定義的,其他的是稍後添加的。我可以查看顯示他的實驗室和學科細節(如果可用)的教師的記錄。

我在C++中的概念不是很強,我不知道哪一個更好。我是否應該在教師課堂中給Lab和Subject課程一個指針,或者我應該讓他們固有它們,還是有更好的方法來做到這一點。

class Lab{ 
    char labCode[20]; 
    char labName[40]; 
     int labYear; 
    //here default constructor 
}; 
class Subject{ 

    char subCode[20]; 
    char subName[20]; 
     int subYear; 
    //here default constructor 
}; 
//------------------------------------- 
class Teacher{ 
    char facName[30]; 
    int teacherSubCount; 
     int teacherLabCount; 
    Subject *subject; 
     Lab *lab; 
    //here default constructor 

}; 
//------------or should i do like this-------------- 
class Teacher:public Lab,public Subject{ 
    char teacherName[30]; 
    int teacherSubCount; 
     int teacherLabCount; 
    //here default constructor 

}; 

如果你能提出任何教程,所以我可以學到指針作爲我的書的電源狀態「指針是非常強大的C++」,但他們只給一些簡單的例子:)

+0

從邏輯上說,教師應該知道實驗室和主題,但他不能從實驗室或主題派生 – CyberDem0n 2012-08-14 15:42:03

回答

4

「贊成'對象組合'超過'類繼承'。」 - Gang of Four

更具體到你的班級,但是,首先問問自己......「老師是一種實驗室還是一種主題?顯然,答案是「不」。

在繼承模型中,子類本身應該是父類的一個實例。考慮到Liskov Substitution Principle,該子對象應該可以作爲該父對象進行處理。所以如果有代碼需要尋找Subject,你可以通過它Teacher。直觀地說,這沒有多大意義,並且不是對正在建模的現實世界域實體的準確表示。

在這種情況下,您絕對需要對象組合而不是類繼承。該TeacherLabSubject,不LabSubject。事實上,如果Teacher可以具有多個LabSubjects,那麼組合將僅從單個實例類成員改變到某種類型的數組或列表。而在這種情況下繼承方式將完全打破。

在建模表示像這樣的真實世界概念的對象時,請首先考慮那些真實世界概念的直覺和實現輔助的技術捷徑。如果對於正在建模的東西沒有意義,那麼在代碼中也是沒有意義的。

+0

好吧我明白我應該用什麼和在哪裏,但另一個問題想到的是,讓一個老師教一個以上的科目,而不是我如何指出所有的科目,我應該怎麼做,如果他分配一個主題。我知道如何使用固定長度的對象,但是當長度變化時,我真的不知道該怎麼做。 – netsmertia 2012-08-14 16:37:16

+0

以及任何強烈的指向C++中的對象的指針的書。我知道什麼是對象,類,繼承......等術語,但是如何擴展我的知識以正確使用它們。 – netsmertia 2012-08-14 16:39:37

+0

@NatwarSingh:如果一個'Teacher'可以擁有(或者以某種方式關聯)多於一個'Subject',那麼我想象這個類成員將是一個'Subject'數組。我不知道C++的具體細節,但在C#中,我會使用'IEnumerable '或'IList '來表示「主題」列表。 – David 2012-08-14 17:07:05

3

想想是否該「是A」(爲傳承)和「具有A」(用於聚集)的關係對你提出的解決方案是有意義

一個Teacher既不是Lab也不是Subject - 我想你應該與匯聚解決方案去。

但是,在開始使用代碼之前,您真正需要完全排序的是您的數據模型。您需要確定對象之間的關係和多樣性(即一對一,一對多等)。

1

以常理的做法:

繼承表達的is-a關係。老師很明顯是 既不是SubjectLab這將是一個嚴重的眼眉 提高。所以我說聚合(has-ahas-many)是 去的方式。

您還需要決定是否使用值語義 或引用語義。這意味着將等於在您的程序中實際等於 對象,或者將通過某個對象的某些 部分計算相等值。

如果您使用引用語義,您將需要確保您使用智能指針或其他形式的內存管理,否則 事情變得非常快速醜陋 。

+0

由於不止一位教師可以教授某個主題,所以不能很好地使用值語義。教師不以任何方式擁有這些科目;這裏沒有什麼可推薦使用我知道的任何類型的智能指針。 – 2012-08-14 15:47:32

+0

@JamesKanze如果平等是價值平等,許多教師如何處理一個主題?對於智能指針:爲什麼'shared_ptr/weak_ptr'不能在這裏工作? – pmr 2012-08-14 15:50:17

+0

如果'Subject'具有值語義,那麼沒有問題(並且不需要指針)。在OO設計中,情況可能不是這樣。而'shared_ptr'肯定不行;是否存在特定的「主題」與是否有任何教師正在教學無關。 (另外,無論何時你需要使用'weak_ptr',你都可以完全放棄智能指針,因爲分析哪些指針必須比較弱,比手動內存管理更復雜。) – 2012-08-14 18:07:36

3

繼承意味着「is-a」關係,而指針意味着「有-a」關係。

老師是實驗室嗎?老師是一個學科嗎?不,它有一個主題,它有一個實驗室,所以這是一個「有一個」的關係。所以你應該使用指針,在這種情況下。

當你試圖改變老師的實驗室時,爲什麼繼承不起作用會變得明顯。您可以輕鬆地更改指針所指向的對象,但替換基類的所有數據會更麻煩。

舉一個例子,您將使用繼承,英語教師可以繼承教師,因爲它也是一名教師,但具有額外的能力。

+0

我不確定那甚至「有-a」對應。有一種關係,但就是這樣。 – 2012-08-14 15:48:12

1

當你繼承一類,因爲在你的最後一個例子,把它作爲擴展該類現有的,定義的行爲。然後,問一下自己的問題:「老師」是否提高了「實驗室」的能力?對我來說,答案很清楚 - 它們不是 - 它們是完全不同的對象,因此繼承不是在問題域中對這些元素建模的理想方式。老師一個班級,班有個學科,等等 - 因此,聚合似乎是一條更好的路徑。

0

你會明白的概念,如果你看看下面這個例子:

void doExperimentsIn(Lab &room){...} 

如果從Lab派生Teacher,你就可以做一個Teacher內實驗了。 (這很愚蠢)