以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 软件工程论坛 』   (http://bbs.xml.org.cn/list.asp?boardid=48)
----  组合,聚合的又一区别  (http://bbs.xml.org.cn/dispbbs.asp?boardid=48&rootid=&id=28543)


--  作者:pennyliang
--  发布时间:3/13/2006 1:24:00 PM

--  组合,聚合的又一区别
组合聚合的主要区别
组合:异构性,部分和主体具有生命期上的一致性
聚合:同构性,主体和部分不具有生命期的一致性

我认为又一重大区别是(推论)
定义:
自组合,自聚合:自组合就是类型本身组合了自己的一个类型,自聚合就是类型本身聚合合了自己的一个类型。
推论:那么很明显,自组合是不成立的,这会引起循环构造,自聚合是成立的,聚合的过程和主体创建的过程在时间上是分离的。
应用:设计模式中singlton模式中,实例的类型如下
class T
{
   static T* m_instance;
}
这是自聚合的典型应用。

以上想法来自meyer的面向对象软件构造一书。


--  作者:jiachong
--  发布时间:3/21/2006 12:54:00 PM

--  
这个例子有点欠妥,因为组合聚合都是对象层面的
那么举个static的例子似乎不恰当
--  作者:pennyliang
--  发布时间:3/21/2006 6:54:00 PM

--  
有道理,这个例子是不是好一点
Class TreeNode
{
   TreeNode* m_leftNode;
    TreeNode* m_rightNode;
}
--  作者:jiachong
--  发布时间:3/22/2006 12:43:00 PM

--  
这个例子问题在于聚合对象只是类型上的“同”,而不是实例上的“同”
那么这种类型上的自组合似乎也可以,例如一个form作为容器嵌套包含许多panel

所以,类型上的自组合和自聚合应该都可以,但创建操作不能发生在构造器上,因为构造器会因对象创建而反复执行下去


--  作者:pennyliang
--  发布时间:3/24/2006 8:01:00 PM

--  
不是吧
Class TreeNode
{
   TreeNode m_leftNode;
   TreeNode m_rightNode;
}
这样写的话编译肯定不同过,我没有编译器,即使可以编译通过,也不对,这样就循环构造了.
--  作者:jiachong
--  发布时间:3/27/2006 12:41:00 PM

--  
关键看语言对申明的处理了,比如Java,这样肯定没问题,因为两个成员只是空的引用,并不会导致构造
如果编译器对这种声明会自动构造对象,那么就和我说的“创建操作发生在构造器上”是一回事了
--  作者:pennyliang
--  发布时间:3/28/2006 9:20:00 AM

--  
对,这个应该和C#一样的,得确如此,在java中这样写没有问题,应为这些语言只有基本类型是值类型,其他都是引用类型,和C++不同。
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms