2014-02-11 102 views
-2

這是一個理論問題,我還沒有想出一個直接很好解釋的答案,關於面向對象的設計。 假設我們有一類音樂事件,並且我們想要實現一個評級類,也許有一個int成員(星星1-5),也許一個吸氣和一個setter函數。 也許我還沒有想到一些更大的圖片呢?作爲另一個類的成員繼承vs類

如果我們希望我們音樂事件​​類有收視率(只有一個不是數組),爲什麼會更好 - 如果它是 - 從評級類繼承,而不是增加一個等級類成員在音樂事件類裏面?

在編碼:

//why is this better... 
class MusicEvent:public Rating { 
    string name; 
    string duration; 
    //and other stuff here 
} 


//...than this 
class MusicEvent { 
    string name; 
    string duration; 
    Rating rating; 
//and other stuff here 
} 
+0

古老的格言說:「寧願組合比繼承」。 – Kayaman

回答

3

這不是更好。你自己回答了這個問題 - 它的評級,它是不是的評級。埃爾戈,組成更好(即會員)。

繼承表示is-a的關係。構圖表示has-a的關係。

+1

我會將術語組合改爲聚合,因爲組合會傳播某種存在標準。音樂事件可以在沒有評分的情況下存在。 – fyr

+0

@fyr「組合」是這裏的常用術語,事實上,在這個模型中,音樂事件__不存在沒有評級(雖然它當然可以是空值) – Alnitak

+0

@Annitak它不是。 「構成」是指「......的一部分」......「聚合」是指「有一個......」,它由UML明確定義。對不起,如此挑剔。 – fyr

0

該評級應該是的成員 - 它是事件的屬性(即屬於它的東西)。

Rating得出的結論只有在你將多種應用事件作爲一個普通集合處理時纔會有意義,而不必關心它們是什麼類型的事件。

0

顯然MusicEvent不是一個Rating,一個MusicEventRating,這樣給你答案。

不過,你可能希望以後做的是有一個接口稱爲Rateable,或類似的東西,與setRating()getRating()抽象方法。如果你將來會有很多不同的課程,這些課程可能會很有用,其中一些課程有評分,有些則沒有。