继承vs class作为另一个类的成员

时间:2014-02-11 07:43:11

标签: java c++ oop design-patterns inheritance

这是一个理论问题,我还没有想到一个关于面向对象设计的直接解释答案。 我们假设我们有一个音乐事件类,我们想要实现一个可能有一个int成员(星级1-5)和一个getter和一个setter函数的Rating类。 也许我还没想到更大的图片呢?

如果我们希望我们的音乐事件类具有评级(只有一个不是数组),为什么它更好 - 如果是 - 继承评级类,而不是在音乐事件类中添加一个评级类成员?

编码:

//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
}

3 个答案:

答案 0 :(得分:3)

不是更好。你自己回答了这个问题 - 评级,不是评级。因此,成分更好(即成员)。

继承表示是-a 关系。合成表示 has-a 关系。

答案 1 :(得分:0)

评级应该是成员 - 它是事件的属性(即属于它的东西)。

如果您希望将多种(或“类别”)可评级事件视为一种常见的集合而不关心它们是什么类型的事件,那么从Rating派生只会有意义。

答案 2 :(得分:0)

显然,MusicEvent 不是 RatingMusicEvent Rating,因此你的答案。

但是,您以后可能要做的是使用RateablesetRating()抽象方法,使用名为getRating()接口或类似的东西。如果您将来某个时候有很多不同的课程,其中一些课程有评分而有些课程没有,则可能会有用。