面向对象设计中的组合逻辑是什么?

时间:2014-11-13 18:57:41

标签: oop object-composition

我对组成(有)关系感到困惑。我很清楚,例如 car has a motor 类。 我的问题是他们没有逻辑上拥有另一个类的类,但是在物理上拥有它们才能使用它们。您必须拥有一个引用或拥有一个类才能使用它的方法,但有时它在逻辑层面上没有意义。 例如,假设有一个类garbage man,而另一个类waste container。垃圾人使用废物容器的empty方法,并且为了使用其方法,请参考废物容器。 这是否意味着垃圾人在面向对象的设计上有一个(好的,多个)废物容器?我会说垃圾人使用废物容器,但它让我困惑,因为垃圾人身体上有它。 有人可以告诉我逻辑吗?

2 个答案:

答案 0 :(得分:0)

您拥有的对象和您引用的对象。如果包含对象拥有包含的对象,则意味着包含对象负责包含对象的生命周期 - 创建它,处理它(如果它是可以被处置的对象)。所有者还可以将包含对象的所有权传递给另一个对象。

您引用的对象是您可以使用但不拥有的对象。所有者通常会给你一个对象的引用(通过将它作为参数传递给函数调用),并保证在你有引用时对象处于有效状态(某些环境通过自动提供帮助)垃圾收集)

“有”关系可能是拥有或引用,并且大多数计算机语言不包括对参考/所有权区分的明确支持,但是在设计中保持直接是一个重要的概念。 UML建模语言确实模拟了这种区别:所有权表示“复合”关系,而引用是“聚合”关系。

答案 1 :(得分:0)

GarbageMan没有 WasteContainer,因为废物容器不以任何方式描述垃圾人或扩展其属性方式。

我认为你在这里错过了一次手术。 WasteContainerempty()方法,因为这是可以在其上执行的操作。但是GarbageMan也有一个操作。 GarbageMan可以performJob()WasteContainer进来的地方。考虑这样的事情(与语言无关):

class WasteContainer {
    empty() { ... }
}

class GarbageMan {
    performJob(Collection<WasteContainer> containers) {
        foreach (var container in containers) {
            container.empty();
        }
    }
}

GarbageMan 了解 WasteContainer,因为这是他工作的一部分。但他并不 WasteContainer因为保持他们的状态并不是他工作的一部分。他对他们进行了操作,但并不拥有它们。

这可以通过使用接口进一步抽象。例如:

interface Emptyable {
    empty();
}

class WasteContainer : Emptyable {
    empty() { ... }
}

class GarbageMan {
    performJob(Collection<Emptyable> bins) {
        foreach (var bin in bins) {
            bin.empty();
        }
    }
}

现在GarbageManWasteContainer进一步解耦。可以有多种容器可以清空,GarbageMan可以处理所有这些容器。操作执行相同,只需向GarbageMan提供一组容器,他就可以完成自己的工作。

这似乎更接近地模拟了观察到的现实场景,而不是拥有GarbageMan状态的WasteContainers。可能会有一些Employer管理哪个WasteContainers被发送到特定的GarbageMan个实例,可能会有不同的Customer实际拥有WasteContainer个或Emptyable个其他种类的{{1}}等等。