0

伙计们正在寻找组合和继承之间的区别,然后我在某个地方找到了这篇文章。

根据post组合在代码重用方面优于继承。

class Fruit {

    // Return int number of pieces of peel that
    // resulted from the peeling activity.
    public int peel() {

        System.out.println("Peeling is appealing.");
        return 1;
    }
}

class Apple {

    private Fruit fruit = new Fruit();

    public int peel() {
        return fruit.peel();
    }
}

class Example2 {

    public static void main(String[] args) {

        Apple apple = new Apple();
        int pieces = apple.peel();
    }
}

更改后端类

class Peel {

    private int peelCount;

    public Peel(int peelCount) {
        this.peelCount = peelCount;
    }

    public int getPeelCount() {

        return peelCount;
    }
    //...
}

class Fruit {

    // Return int number of pieces of peel that
    // resulted from the peeling activity.
    public Peel peel() {

        System.out.println("Peeling is appealing.");
        return new Peel(1);
    }
}

// Apple 必须更改以适应 // 对 Fruit 的更改

class Apple {

    private Fruit fruit = new Fruit();

    public int peel() {

        Peel peel = fruit.peel();
        return peel.getPeelCount();
    }
}

// Example2 的旧实现 // 仍然可以正常工作。

class Example1 {

    public static void main(String[] args) {

        Apple apple = new Apple();
        int pieces = apple.peel();
    }
}

这是我没有根据帖子所说的“如果后端类的接口发生变化,前端类的实现也会发生变化,但它的接口不会发生变化”

这里的接口是什么实现是什么?

这只是我的假设,如果我错了,请告诉我??(也许一切都错了)。

后端类是接口,因为前端类依赖于它吗?
前端类的实现是前端类内部的实现代码吗?前端
类 是否也是一个接口,因为 Example 中的代码依赖于它?

它们是否因为更改后端接口没有更改前端接口而耦合得很糟糕?所以依赖前端接口的代码还是可以的。

如果我使用继承而不是子类在超类中紧密耦合?因为对超类的更改也会更改为子类,因此依赖于子类的代码可能无法正常工作。

Wny 继承是弱封装。

4

1 回答 1

3

就是Apple 和 Fruit 之间应该存在的直观继承关系。然而,这不是上面的例子所做的。

在此处输入图像描述

上面的例子是使用组合,这意味着它Fruit是(见 uml here)的一部分。 这很违反直觉!在这种情况下,两者都有剥离的单独实现。in的实现使用.AppleFruitApplepeel()AppleFruit.peel()

在此处输入图像描述

我认为要提出的观点是,如果Apple使用与 的组合关系Fruit,那么它的实现可以独立于 Fruit。例如,我可以使用其他实现,而不是使用Fruit.peel()来获取计数。Apple.peel()但如果Apple继承自剥离Fruit,那么一变Fruit也变Apple。因此Apple不是独立的Fruit,所以我们说它是紧耦合的。

从几个方面来看,这是一个不好的例子,1)我们都知道苹果 水果,所以继承似乎是最正确的实现。2)继承似乎是实现事物的最干燥的方式,因为使用组合需要您更正类以执行与更改时Apple相同的事情。FruitFruit.peel()

编辑:阅读了这篇文章后,我觉得重点是概述使用继承的陷阱。适当地使用继承并没有错。如果子类没有真正从超类继承行为,仅仅为了代码重用而使用它可能会导致问题。

来回答你的问题!

后端类是接口,因为前端类依赖于它吗?

足够接近。所有类都有一个“接口”。这并不意味着它们implements IFruit在类声明中确实有,它只是指对象的形状- 对象具有哪些方法,无论这些方法如何工作。

前端类的实现是前端类内部的实现代码吗?

大致,是的。构成类中方法主体的代码的实际逻辑是该类的实现。

前端类是否也是一个接口,因为 Example 中的代码依赖于它?

差不多。Apple隐含地有一个接口,就像任何其他类一样。如果Example使用Apple该类,那么它只能通过使用作为接口一部分的方法来实现。

它们是否因为更改后端接口并没有更改前端接口而耦合得很糟糕?

是的,这是使用“松散耦合”这个短语的一种方式。

如果我使用继承而不是子类在超类中紧密耦合?因为对超类的更改也会更改为子类,因此依赖于子类的代码可能无法正常工作。

是的,这是正确的。这两个类是紧密耦合的,因为它们的行为没有完全封装在每个单独的类中。这并不总是错误的,这取决于情况。

Wny 继承是弱封装。[原文如此]

因为行为是在超类和子类之间共享的。

于 2012-05-15T01:18:58.157 回答