OOP:你如何在OOP中建立艺术家,专辑和歌曲关系

sim*_*son 5 php oop inheritance class

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

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

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

class Song extends Album{}
class Album extends Artist{}
Run Code Online (Sandbox Code Playgroud)

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

我在PHP中这样做

Vic*_*let 24

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

class Album
{
  public $artists = array(); // Array of Artist instances
  public $songs   = array(); // Array of Song instances
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这个模型并没有真正指出哪些艺术家涉及哪些歌曲.我认为最好有类歌曲{string []艺术家; 字符串名称; int genre}`以及`class Album {Song []歌曲; 字符串目录; string publisher}` (9认同)

Tom*_*lis 13

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

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

class Album {
    Song[] tracks;
}
Run Code Online (Sandbox Code Playgroud)


Wel*_*bog 5

不要为这种关系使用遗产,为了所有油炸和充满美味的奶油!

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

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