我对组成(有)关系感到困惑。我很清楚,例如 car 类has a
motor 类。
我的问题是他们没有逻辑上拥有另一个类的类,但是在物理上拥有它们才能使用它们。您必须拥有一个引用或拥有一个类才能使用它的方法,但有时它在逻辑层面上没有意义。
例如,假设有一个类garbage man
,而另一个类waste container
。垃圾人使用废物容器的empty
方法,并且为了使用其方法,请参考废物容器。
这是否意味着垃圾人在面向对象的设计上有一个(好的,多个)废物容器?我会说垃圾人使用废物容器,但它让我困惑,因为垃圾人身体上有它。
有人可以告诉我逻辑吗?
答案 0 :(得分:0)
您拥有的对象和您引用的对象。如果包含对象拥有包含的对象,则意味着包含对象负责包含对象的生命周期 - 创建它,处理它(如果它是可以被处置的对象)。所有者还可以将包含对象的所有权传递给另一个对象。
您引用的对象是您可以使用但不拥有的对象。所有者通常会给你一个对象的引用(通过将它作为参数传递给函数调用),并保证在你有引用时对象处于有效状态(某些环境通过自动提供帮助)垃圾收集)
“有”关系可能是拥有或引用,并且大多数计算机语言不包括对参考/所有权区分的明确支持,但是在设计中保持直接是一个重要的概念。 UML建模语言确实模拟了这种区别:所有权表示“复合”关系,而引用是“聚合”关系。
答案 1 :(得分:0)
GarbageMan
没有 WasteContainer
,因为废物容器不以任何方式描述垃圾人或扩展其属性方式。
我认为你在这里错过了一次手术。 WasteContainer
有empty()
方法,因为这是可以在其上执行的操作。但是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();
}
}
}
现在GarbageMan
与WasteContainer
进一步解耦。可以有多种容器可以清空,GarbageMan
可以处理所有这些容器。操作执行相同,只需向GarbageMan
提供一组容器,他就可以完成自己的工作。
这似乎更接近地模拟了观察到的现实场景,而不是拥有GarbageMan
状态的WasteContainers
。可能会有一些Employer
管理哪个WasteContainers
被发送到特定的GarbageMan
个实例,可能会有不同的Customer
实际拥有WasteContainer
个或Emptyable
个其他种类的{{1}}等等。