-1

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

遗产:

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);
    }
}

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

4

3 回答 3

2

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

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

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

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

于 2013-10-23T21:03:52.117 回答
1

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

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

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

于 2013-10-23T21:03:44.547 回答
0

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

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

你也可以这样想——如果我有田地清单,那么在这个清单里有田地和种植园有意义吗?如果没有,则无法进行扩展。

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

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

于 2013-10-23T21:07:40.647 回答