【问题标题】:Inheritance or delegation? Which one to pick? [duplicate]继承还是委托?选哪一个? [复制]
【发布时间】:2013-10-23 20:56:43
【问题描述】:

有时毫无疑问,但有时这可能是一个非常艰难的决定。让我给你看几个例子:

继承:

public class Employee{
    public void goToWork(){
        //...
    }
}
public class Lawyer extends Employee{
    //private Employee body;
    /*public void goToWork(){
        body.goToWork(); // Does that make any sense?
    }*/
}

代表团:

public class Lights{
    public void turnOn(){
        //...
    }
}
public class Car{ //public class Car extends Lights? Nice car then...
    private Lights light;
    public void turnOnLights(){
        light.turnOn();
    }
}

哪个?

public class Field{
public void grow(Seeds s){
        //...
    }
}
public class Plantation{ //extends Field{ makes sense too
    private Field field;
    private Worker[] workers;
    private Vehicle[] tractors;

    public void grow(Seeds s){
        //...
        field.grow(s);
    }
}

那么,在继承和委托都可以接受并且各有优缺点的情况下,是否有任何提示可以帮助在继承和委托之间进行选择?选择是随机的,完全取决于程序员的心情吗?

【问题讨论】:

  • 你总是会过度使用其中一个,这取决于你的背景。
  • @Hot Licks 人生充满选择

标签: java


【解决方案1】:

种植园不会扩展 Field,因为 (a) 种植园不仅仅是一块田地,而且 (b) 种植园可能有多个田地。

这种的情况下,种植园不是田地,因为田地没有自己的拖拉机。

您可能会暂时田地与拖拉机关联,例如,出于调度目的,但拖拉机属于总体容器,即种植园。

继承的范围通常非常有限,并且仅在行为特征被相当精确地共享时才有效。在这种情况下,特征本质上不是共享的,调度将由完全不同的机制处理。

【讨论】:

    【解决方案2】:

    它们确实有不同的优点和缺点。例如,您只能继承一件事。如果您决定继承 (public class Plantation extends Field),然后决定您真的希望您的 Plantation 有多个 Fields,该怎么办?如果您决定多个Plantations 可以共享一个Field 怎么办?

    组合(或您所称的委托)通常对未来更加安全,但继承通常非常方便或在技术上是正确的。 “X 继承 Y”意味着“X 是 Y”,因此在该陈述在技术上正确的情况下(例如,“正方形是矩形”)很有用。

    归根结底,这是由实现代码的人决定的设计决策。这里没有“正确”的答案。

    【讨论】:

    【解决方案3】:

    这实际上取决于您已经知道的决策,它是:“孩子是否拥有并需要所有(几乎所有)功能作为其父母?”

    与委托相比:“对象是否在其主体内包含另一个对象。”

    您也可以这样想 - 如果我有田地列表,那么在此列表中包含田地和种植园是否有意义?如果没有,则无法进行扩展。

    关于这个例子 - 我更喜欢委托,因为种植园不仅仅是扩展的田地,它是利用田地和人等来赚取利润的东西。

    如果您需要相同或相似的方法(如增长),但工作方式略有不同,您应该有两个类都实现的接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多