我试图确认我对代码对于关联,聚合和组合的看法.所以这里..
聚合:Has-a.它具有另一种类型的现有对象
public class Aggregation
{
SomeUtilityClass objSC
public void doSomething(SomeUtilityClass obj)
{
objSC = obj;
}
}
Run Code Online (Sandbox Code Playgroud)
构成:由另一个对象组成
public class Composition
{
SomeUtilityClass objSC = new SomeUtilityClass();
public void doSomething()
{
objSC.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
协会:我对此有两种看法.
关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用.
public class Association
{
//SomeUtilityClass objSC /*NO local reference maintained */
public void doSomething(SomeUtilityClass obj)
{
obj.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)我的理解是否正确?我在这里和这里读过相互矛盾的文章,所以我真的不确定应该遵循哪一条.我的理解似乎与第一个链接一致.我觉得第二个环节是错误的,或者也许我没有理解它.
你怎么看?
And*_*xei 56
对于两个对象Foo,Bar我们有:
相关性:
class Foo
{
...
fooMethod(Bar bar){}
...
}
Run Code Online (Sandbox Code Playgroud)
协会:
class Foo
{
private Bar bar;
...
}
Run Code Online (Sandbox Code Playgroud)
成分:(当它Foo死的时候Bar)
class Foo
{
...
private Bar bar = new Bar();
...
}
Run Code Online (Sandbox Code Playgroud)
聚合:(当Foo死亡,Bar可能继续存在)
class Foo
{
private List<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)
Tud*_*dor 22
聚合和组合之间的差异非常模糊,AFAIK与容器被销毁后"子"对象的逻辑存在有关.因此,在聚合的情况下,容器内的对象在容器对象被销毁之后仍然可以存在,而在组合设计的情况下,它们也被销毁.一些类比:
Car含有四个对象Wheel的对象.通常情况下,如果你摧毁汽车(通过调用某种方法来清理它),你也应该在过程中摧毁车轮,因为它们在汽车外面存在是没有意义的(除非你把它们移到另一个Car物体上).更现实地说,包装输入流的读取器对象也将在其自身关闭时关闭内部流.这是作文.Person对象包含(拥有)Radio对象.如果Person死亡,则Radio可以由另一个继承,Person即在没有原始所有者的情况下存在它是有意义的.更现实地,列表保持对象不要求在列出列表本身时处理所有对象.这是聚合.编辑:阅读完链接后,我倾向于选择第一个链接,因为它给出了类似于我的解释.
此外,关联只是通过对该对象的引用来调用方法(发送消息)到另一个对象.