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

与面向对象设计相关的组合是什么?

  •  54
  • DaveDev  · 技术社区  · 15 年前

    我听到(在这个网站上读到)很多关于“赞成组合胜过继承”。

    但什么是排字?我从人的角度理解遗传:哺乳动物:动物,但我在任何地方都看不到堆肥的定义。有人能帮我填一下吗?

    5 回复  |  直到 13 年前
        1
  •  60
  •   FrustratedWithFormsDesigner    15 年前

    组合是指将简单的类型组合成更复杂的类型。在您的示例中,组合可以是:

    Animal:
        Skin animalSkin
        Organs animalOrgans
    
    
    Mammal::Animal: 
        Hair/fur mammalFur
        warm-blooded-based_cirulation_system heartAndStuff
    
    Person::Mammal: 
        string firstName
        string lastName
    

    如果你想进行完全的组合(并摆脱所有的继承),应该是这样的:

    Animal:
        Skin animalSkin
        Organs animalOrgans
    
    Mammal:
        private Animal _animalRef
        Hair/fur mammalFur
        warm-blooded-based_cirulation_system heartAndStuff
    
    Person:
        private Mammal _mammalRef
        string firstName
        string lastName
    

    这种方法的优点是 Mammal Person 不必符合其前一个父级的接口。这个 能够 这是一件好事,因为有时对超类的更改会对子类产生严重的影响。 他们仍然可以通过这些类的私有实例访问这些类的属性和行为,如果他们想公开这些以前的超类行为,可以简单地将它们包装在公共方法中。

    我在这里找到了一个很好的链接和很好的例子: http://www.artima.com/designtechniques/compoinh.html

        2
  •  37
  •   Cylon Cat    15 年前

    组合只是组成整体的部分。汽车有轮子、发动机和座椅。继承是一种“是”的关系。作文是一种“有”的关系。

        3
  •  18
  •   Carl Manaster    15 年前

    有三种方法可以给一个班的学生提供行为。可以将该行为写入类中;可以从具有所需行为的类继承;也可以将具有所需行为的类作为字段或成员变量合并到类中。最后两种表示代码重用的形式,最后一种形式——组合——通常是首选的。实际上,它并没有给类提供所需的行为——您仍然需要在字段上调用该方法——但是它对类设计的约束更少,从而使测试更容易,代码更容易调试。继承有它的位置,但组合应该是首选。

        4
  •  16
  •   Zak    15 年前
    class Engine
    {
    
    }
    
    class Automobile
    {
    
    }
    
    
    class Car extends Automobile // car "is a" automobile //inheritance here
    { 
     Engine engine; // car "has a" engine //composition here
    
    }
    

    作文 -对象的功能由不同类的聚合组成。在实践中,这意味着持有一个指向另一个类的指针,工作被延迟到该类。

    遗传 -对象的功能由它自己的功能加上其父类的功能组成。

    至于为什么组合优先于继承,请看 Circle-ellipse problem .

        5
  •  4
  •   Iain Ward    15 年前

    组合的一个例子是在另一个类中有一个类的实例,而不是从它继承

    This 佩奇有一篇很好的文章,解释了为什么人们会说“喜欢组合胜过继承”,并举例说明了原因。

    推荐文章