我理解继承的基础知识,但这个让我感到困惑。你会怎么说:
我目前的代码只允许每个对象播放一首歌曲:
class Song extends Album{}
class Album extends Artist{}
我确信我忽略了一些重要的事情。有什么想法吗?
我在PHP中这样做
答案 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)
如果您告诉我们您希望实现的目标,这可能有助于我们找到正确的答案。但是,这些关系通常会存储在您的数据库中。