OOP:你如何设置一个艺术家,专辑& OOP中的歌曲关系

时间:2010-01-08 19:02:12

标签: php oop class inheritance

我理解继承的基础知识,但这个让我感到困惑。你会怎么说:

  • 相册对象具有一个或多个艺术家对象
  • 专辑对象具有一个或多个歌曲对象

我目前的代码只允许每个对象播放一首歌曲:

class Song extends Album{}
class Album extends Artist{}

我确信我忽略了一些重要的事情。有什么想法吗?

我在PHP中这样做

11 个答案:

答案 0 :(得分:24)

相册 一个或多个艺术家对象。继承意味着专辑 是艺术家。你需要的是(编辑)聚合:

class Album
{
  public $artists = array(); // Array of Artist instances
  public $songs   = array(); // Array of Song instances
}

聚合意味着每个艺术家和歌曲实例都可能属于其他专辑。通过合成,艺术家或歌曲可能属于单个专辑。

答案 1 :(得分:12)

正如我在其中一篇评论中所提到的,如果你必须通过OOP建模,我会说,

class Song {
    string[] artists;
    string title;
    int genre;
}

class Album {
    Song[] tracks;
}

答案 2 :(得分:5)

为了所有油炸和充满美味奶油的缘故,不要将继承用于这种关系!

一首歌不是专辑的延伸,它是专辑的一部分。同样,专辑不是艺术家的延伸,而是由艺术家创作的。此外,一首歌可以出现在多张专辑中,一张专辑可以有多位艺术家。

对于这种情况,您应该使用has-a关系而不是继承。例如,您可能有一个具有Song对象数组的Album对象作为成员。这将传达歌曲适当地属于专辑的想法。

答案 3 :(得分:3)

尝试根据哪些对象具有哪些属性来考虑它。即“汽车 HAS 一种颜色”或“气球 HAS 一个字符串”。

  

歌曲 HAS 艺术家

     

专辑 HAS 歌曲

因此,您的Song类将具有Artist对象,而您的Album类将包含Song对象的集合。

答案 4 :(得分:2)

我认为这三个类中没有任何继承。歌曲是专辑吗?不,我不认为这不是宋不应该从专辑继承。专辑是艺术家吗?不,我不认为这是专辑不应该继承艺术家。

相反,你想看看封装。专辑引用零个或多个艺术家。专辑包含零个以上的歌曲。艺术家引用零个或多个相册。

答案 5 :(得分:1)

继承关系被命名为“IS-A”,而您正在寻找的关系是 HAS-A

你需要这样的东西:

Album
    artists: Artist[1..*]
    songs  : Song[1..*]

专辑 HAS 从1到多(*)艺术家(由Artist数组定义)和1张专辑有1到多(*)首歌曲(由Song数组定义)< / p>

答案 6 :(得分:1)

赞成合成而不是继承。

你所说的应该是这样的:

专辑对象具有一个或多个艺术家对象。专辑对象具有一个或多个歌曲对象

班级相册 {    艺术家[]艺术家;    歌曲[]歌曲; }

然而,这并不是我想象的那样。我认为每张专辑都有一首或多首由一位或多位艺术家表演的歌曲。我会这样做:

班级相册 {    歌曲[]歌曲;    //其他专辑特定属性 }

课堂歌 {    艺术家[]艺术家;    //其他歌曲特定属性 }

班级艺术家 {    //艺术家特定的属性 }

我强烈建议您考虑OOD原则。

答案 7 :(得分:0)

我不确定你是否正确使用OOP。通常,当父对象具有与父对象相同的功能时,它会扩展父对象,但会增加一些额外(或特定)功能。

例如,让我们使用汽车行业:

class Automobile {}

class Truck extends Automobile {}
class Car extends Automobile {}

class Lexus extends Car{}

了解雷克萨斯是如何最具体的,所以它建立一个层次结构,因为它上升?

你想要的东西类似于has_many关系。艺术家有很多专辑,一张专辑有很多歌曲等等。

修改1:正如Victor Nicollet所说,您需要composition

编辑2:如评论中所述,您实际上需要aggregation。所提供的文章解释了两者之间的区别。

答案 8 :(得分:0)

这是我的观点。

专辑包含歌曲,但歌曲不是专辑 相册与艺术家相关联,但相册不是艺术家。

您正在将继承与关系混合在一起。

答案 9 :(得分:0)

这听起来像是一个数据库建模问题,而不是OOP之一。这是因为你很可能拥有歌曲艺术家和专辑的数据库。不是类层次结构。

答案 10 :(得分:0)

如果您告诉我们您希望实现的目标,这可能有助于我们找到正确的答案。但是,这些关系通常会存储在您的数据库中。