1

在使用组合将对象用作其他对象中的属性(以及在属性上调用方法)与具有良好的整体耦合之间,我感到有些困惑。

这里有权衡吗?

也许更容易给出耦合不良的例子来解释差异(如果有差异)?

编辑示例:

public class MyClass(){
    MyOtherClass moc;

    public MyClass(MyOtherClass temp){
        moc = temp;
    }

    public void method(){
        moc.call()
    }
}

这是因为对组合关系的依赖而导致的不良耦合吗?如果不是,那么在这个例子中什么是糟糕的耦合。

4

2 回答 2

2

关联类的两种基本方法是inheritanceand composition。当您在两个类之间建立继承关系时,您可以利用dynamic bindingand polymorphism

鉴于这种inheritance关系很难更改interface超类的 ,因此值得研究composition. 事实证明,当您的目标是代码重用时,composition提供了一种生成更易于更改代码的方法。

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 extends Fruit {
}

class Example1 {

public static void main(String[] args) {

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

但是,如果在将来的某个时间点,您希望将peel() 的返回值更改为 type Peel,您将破坏 Example1 代码的代码,即使 Example1 直接使用 Apple 并且从未明确提及 Fruit。

Composition为 Apple 重用 Fruit 的peel(). FruitApple 可以保留对实例的引用并定义自己的peel()方法来简单地调用Fruit,而不是扩展peel()Fruit。这是代码:

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

Inheritance给你比Composition.

于 2012-07-10T09:13:09.243 回答
2

似乎最被接受的术语是紧/松耦合,而不是坏/好耦合,松散耦合的对象是首选。在您的示例中,更紧密的耦合可能是这样的(添加了用于说明的功能):

public class MyClass()
{
    MyOtherClass moc;
    public MyClass(MyOtherClass temp)
    {
        moc = temp;
    }

    public void method()
    {
        for (int i = 0; i < moc.items.Count; i++)
        {
            moc.items[i].Price += 5;
        }
    }
}

这里,MyClass 依赖于 MyOtherClass 的具体实现细节(项目列表的实现、成本等...)。处理这种情况的一种更松散耦合的方法是将逻辑移动到 MyOtherClass 上的函数中。这样,MyOtherClass 的所有实现细节都对 MyClass 隐藏,并且可以独立于 MyClass 进行更改。

于 2012-07-12T18:53:43.973 回答