bruce
2003-06-18 12:08
刚才找了一些内部类的资料,发觉我的理解有点不对。

因为内部类如果不是静态申明的话,必须被实例化后才能得到内部类对象。所以内部类可以与包容它的外部类有不同的生命周期。

其实我也只是想从实现的角度去认识 这三种强弱关系的不同。

CC,概念容易理解,你说的没错“组合就是一种很强烈的关联,必须在被组合对象生成的时候,组合对象也就必须生成了”,“组合”例子的代码

容易实现, 但“聚合”,“关联”的代码如何写才能区别出三者强弱关系呢?

请各位道友写几笔示意代码,让大家看看。

a_fan_ti
2003-06-18 12:40
聚合主要反映一种整体-部分的关系,组合反映某部分只能属于某整体(强聚合),他们在代码上是看不出分别的。

wwlhp@jdon.com
2003-06-18 13:26
To Bruce,

我认为从代码的角度理解聚合、关联关系完全是错误的。给你一段代码:

public class A {

private B ref;

public A( B ref ) {

this.ref = ref;

}

...

}

你怎么知道class A和class B是什么关系? 既可以是关联关系,也可以是合成关系,也可以是聚合关系。我觉得这三者要从语义上去理解。

jiangxi
2003-06-18 16:43
同意wwlhp@jdon.com ,我觉得3种关系都能产生

public class A {

private B ref;

public A( B ref ) {

this.ref = ref;

}

...

}

public class B{

...

}

应该从语意,内涵上去理解。比如:

关联:人->习惯,可有可无的东西

聚合:多边形<>->边,角 关系不是很紧密

组合:圆《》->圆心,圆弧 圆由圆心和圆弧组成

bruce
2003-06-18 23:20
多谢楼上几位的回复,基本同意各位的见解。仔细想了一下,觉得要写代码,的确变化比较多,这也是我开始为什么想从实现上分析这三种关系的原因。

尽管实现方式很多,但我还是写了一种实现的代码,我没有写 把对象做为参数传递的情况,不过下面的代码道理是一样的。

======

组合

======

public class A {

//Constructor function must include B and C, all of them have the same life cycle.

public A() {

B b = new B();

C c = new C();

}

...

}

public class B{

}

public class C{

}

======

聚合

======

public class A {

public A() {

}

/* This method is a must method in class A, but this method is called after the constructor function is finished. So A and B,C have the different life cycle. Class A could exist without B,C*/

public void MethodOfA(){

B b = new B();

C c = new C();

}

public class B{

}

public class C{

}

========

关联

========

public class A {

public A() {

}

/* This method is not a must method in class A

Class A only have association with B C when this method is called

*/

public void Method-need-BC(){

B b = new B();

C c = new C();

}

public class B{

}

public class C{

}

猜你喜欢
6Go 上一页 1 2 3 4 5 ... 6 下一页