代码之家  ›  专栏  ›  技术社区  ›  rajachan

我应该使用继承还是组合?

  •  15
  • rajachan  · 技术社区  · 16 年前

    我想把这个短一点。我建了一个有两个房间的房子,比如说 BedRoom StudyRoom 都是从一个名为 Room . 卧室 书房 有一个叫 House . 而且,房子里的任何房间只能通过父母进入其他房间。如果 卧室 必须访问的任何属性 学习室 ,只能通过 房子 (即父母),反之亦然。

    HouseA ISA House
    HouseA HAS BedRoom and StudyRoom.
    BedRoom ISA Room
    StudyRoom ISA Room
    

    现在的问题是:假设,我建造了另一个家(假设 HouseB ,与上述完全相同,但有一个变化。我不想要两个分开的房间(即 卧室 学习室 ,但是一间单人房( MasterRoom )有这两个设施。 为了代码的可重用性,我可以考虑以下设计选项:

    Option-1:
    HouseB ISA House
    HouseB HAS MasterRoom
    MasterRoom ISA Room
    

    在这里,我失去了重用 卧室 学习室 我为之创造的 HouseA . 注意,大多数属性 卧室 学习室 需要重新实施 主人室 总之,这会导致代码重复。

    Option-2:
    HouseB ISA House
    HouseB HAS MasterRoom
    MasterRoom ISA Room
    MasterRoom HAS LogicalBedroom
    MasterRoom HAS LogicalStudyRoom
    LogicalBedroom ISA BedRoom
    LogicalStudyRoom ISA StudyRoom
    

    这样,我就可以使用组合来重用大部分代码(我有几千行代码可以重用),但问题是 卧室 是混凝土等级 logicalBedRoom 可能会发现某些属性不合适,可能会强制重写方法,以便它们不做任何事情。例如, Bedroom->noOfSides() = 4 logicalBedRoom->noOfSides() = ?? . 这是继承的一个好用途吗?

    我的实际设计是一个复杂的芯片,它结合了两个单独的芯片的功能(我使用了house(主板)和room(芯片)类比)。我用面向对象的Perl编写代码,我真的很欣赏任何其他的设计建议。

    谢谢

    1 回复  |  直到 16 年前
        1
  •  19
  •   daotoad    16 年前

    为什么不利用角色来实现这一点:

    House A has a Bedroom
    Bedroom does SleepingArea
    House has a Studyroom
    Studyroom does ComfyArea
    
    House B has a MasterRoom
    MasterRoom does SleepingArea and ComfyArea
    

    最简单的方法 roles 是用来 Moose .