【问题标题】:Inheritance vs class as a member of another class [duplicate]继承与类作为另一个类的成员[重复]
【发布时间】:2014-03-08 21:19:45
【问题描述】:

这是一个理论问题,关于面向对象的设计,我还没有想出一个直截了当的很好解释的答案。 假设我们有一个 Music Event 类,我们想实现一个 Rating 类,它可能有一个 int 成员(星号 1-5),可能还有一个 getter 和一个 setter 函数。 也许我还没有想到更大的图景?

如果我们希望我们的 Music Event 类具有评级(只是一个而不是数组),为什么最好从 Rating 类继承? ,而不是在 Music 事件类中添加 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
}

【问题讨论】:

  • 古老的格言说“更喜欢组合而不是继承”。

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


【解决方案1】:

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

继承表示is-a关系。组合表示关系。

【讨论】:

  • 我会将术语组合更改为聚合,因为组合会推断出某种存在标准。音乐事件可以在没有评级的情况下存在。
  • @fyr "composition" 是这里的常用术语,实际上在这个模型中,音乐事件不能在没有评级的情况下存在(尽管它当然可能是 @987654321 @)
  • @Alnitak 不是。 “组合”是指“一部分”......“聚合”是指“有一个”......它由UML明确定义。抱歉这么挑剔。
【解决方案2】:

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

只有当您想将多种(或“类”)可评级事件视为一个公共集合而不关心它们是什么类型的事件时,派生自 Rating 才有意义。

【讨论】:

    【解决方案3】:

    很明显MusicEvent不是RatingMusicEvent有一个Rating,所以这会给你答案。

    但是,您以后可能想做的是拥有一个名为Rateable 或类似的接口,带有setRating()getRating() 抽象方法。如果您在未来的某个时候有很多不同的课程,其中一些带有评级,而有些则没有,这可能会很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多