对象组成
在计算机科学,对象组成和对象聚集是密切相关的合并方式对象或者数据类型变成更复杂的。在对话中,通常会忽略组成和聚合之间的区别。[1]常见的构图是对象在面向对象的编程,标记的工会,套,序列和各种各样图形结构。对象组成与数据结构有关,但与数据结构不同。
对象组成是指信息的逻辑或概念结构,而不是实现或物理数据结构用来表示它。例如,序列与a不同放因为(除其他事项)组成的项目的顺序对前者而言至关重要,但对后者则无关紧要。数据结构,例如数组,链接列表,哈希表,许多其他人可以用来实施其中的任何一个。也许令人困惑的是,一些相同的术语用于数据结构和复合材料。例如, ”二进制树“可以指的是:作为数据结构,它是访问项目线性序列的一种手段,并且树在树中的实际位置是无关紧要的(可以内部重新安排树,但是一个喜欢,而不会改变其含义)。但是,作为对象组成,位置是相关的,改变它们会改变含义(例如分子图)。
编程技术
面向对象的编程是基于对象至封装数据和行为。它使用两种主要技术将功能组装成更复杂的功能,亚型和对象组成。[2]对象组成是关于将对象组合在复合对像中,同时,通过使用良好的定义来确保每个对象的封装界面没有其内部的可见性。在这方面,对象组成与不强制封装的数据结构不同。
对象组成也可能是关于一组多个相关对象的组,例如集合或一系列对象。代表团可以通过将请求或对封闭复合对象的调用转发到其内部组件之一来丰富组成。[3]
在班级 - 基于和打字编程语言,类型可以分为复合和非复合类型,并且可以将组合视为类型之间的关系:复合类型的对象(例如,车)有“其他类型的对象(例如车轮)。当复合对象包含同一类型的几个子对象时,可以将它们分配给特定角色,通常以名称或数字区分。例如,观点对象可能包含3个数字,每个数字代表沿不同轴的距离,例如“ x”,“ y”和“ z”。一般来说,整个关系的研究是序列学.
构图必须区分亚型,这是将详细信息添加到一般数据类型中以创建更具体的数据类型的过程。例如,汽车可能是特定类型的车辆:车是一个车辆。子类型没有描述不同对象之间的关系,而是说类型的对像是另一种类型的对象。这种关系的研究是本体论.
在原型 - 基于基于的编程语言,例如JavaScript,对象可以在实例化时从原型对像中动态继承行为。组成必须与原型:新实例化对象继承其原型的组成,但本身可以自行组成。
复合对象可以通过共同关注组成的对象,共同列表参考或以许多其他方式来表示。复合对像中的项目可以称为属性,字段,成员,特性,或其他名称,以及由此产生的组成复合类型,存储记录,结构体,元组,或用户定义类型(UDT)。有关详细信息,请参阅聚合下面的部分。
UML建模技术

在嗯建模,对象可以在概念上组成,而不是使用编程语言实现。在UML中组成对象的四种方法:属性,关联,聚合和组成:[4]
- 属性代表类的属性。
- 协会代表语义关系在相关类的实例之间。协会的成员端对应于关联类的属性。
- 聚合是一种建模,该关联模拟了聚合(整体)和一组相关组件(部分)之间的部分/整个关系。
- 一种构图,也称为复合聚合,是一种聚集,该聚合建模了复合材料(整体)和一组独家拥有的部分之间的零件/整体关系。
聚合及其组件之间的关系是弱的“ has-a”关系:组件可能是几个聚集体的一部分,可以通过其他对象访问而无需通过聚集体,并且可能比聚合对象保持不足。[4]组件对象的状态仍然构成聚合对象的一部分。
复合及其部分之间的关系是强烈的“ has-a”关系:复合对象具有唯一的关系”负责组成对象的存在和存储“组成的对象最多可以是一个复合材料的一部分,”如果删除了复合对象,则将其所有部分实例删除“因此,在UML中,组合物比通常的对象组成具有更狭窄的含义。

图形表示法表示:
- 该属性是封闭类框中的打字元素,
- 关联是相关类之间的平整线,
- 这聚合作为骨料侧和实线侧的未填充钻石,
- 组成作为复合材料侧面和实线侧面的钻石。
聚合
聚合不同于普通构图,因为它并不意味着所有权。在构图中,当拥有对像被破坏时,包含的对像也是如此。总体而言,这不一定是正确的。例如,大学拥有各个部门(例如化学),每个部门都有许多教授。如果大学关闭,部门将不再存在,但是这些部门的教授将继续存在。因此,可以将大学视为部门的组成,而部门的教授汇总。此外,一位教授可以在一个以上的部门工作,但是一个系不能成为一所大学的一部分。
通常实现构图,以使对象包含另一个对象。例如,在C ++:
班级教授;//在其他地方定义班级部门{上市:部门(const标准::细绳&标题):标题_(标题){}私人的://聚合:|教授|可能会超过|部门|。标准::向量<标准::feek_ptr<教授>>成员_;const标准::细绳标题_;};班级大学{上市:大学()=默认;私人的://构图:|部门| S仅与教师的存在一样长。标准::向量<部门>学院_={部门(“化学”),部门(“物理”),部门(“艺术”),};};
在汇总中,该对像只能包含指向对象的参考或指针(并且没有寿命对此的责任)。
有时,当普通组成和聚集之间的区别不重要时,聚集被称为组成。
以上代码将转换为以下UML类图:
com的聚合

在微软的组件对像模型,聚合意味着一个对像出口,好像是他们的所有者,一个或几个接口它拥有的另一个对象。正式地,这与作品或者封装比聚合。但是,无需通过调用拥有对象的接口来实现导出的接口,而是导出了自有对象的接口。拥有的对象负责确保从iunknown实际调用所有者的相应方法。这是为了确保所有者的参考计数是正确的,并且所有者的所有接口都可以通过导出的接口访问,而自有对象的其他(私有)接口无法访问。[5]
特殊表格
遏制
用于存储复合数据类型的几个实例的组成称为遏制。此类容器的示例是数组,关联阵列,二进制树, 和链接列表.
在嗯,以0 ..*或1 ..*的多重性描绘,表明复合对象由组合类的一个未知数的实例组成。
递归成分
物体可以递归地组成,然后调用它们的类型递归类型。示例包括各种树,dags, 和图。树上的每个节点可以是分支或叶子。换句话说,每个节点是一棵树,同时属于另一棵树。
在UML中,递归组成是用自身的阶级的关联,聚集或组成描绘的。
复合图案
这复合设计模式是基于复合类型的面向对象的设计,结合了递归组成和遏制,以实现复杂的零件整体层次结构。
C中的复合类型
这是一个构图的示例C.
结构人{int年龄;char姓名[20];枚举{找工作,专业的,非专业,退休,学生}就业;};
在此示例中,原始类型(非合并)类型int,枚举{Job_seeking,专业,非专业,退休,学生}和复合阵列类型char []合并以形成复合结构人。每个人结构“具有”年龄,名称和就业类型。
各种语言的构图时间表
C将记录称为结构或结构;面向对象语言,例如爪哇,短暂聊天, 和C ++通常将记录隐藏在里面对象(班级实例);语言中的语言ML家庭只称他们为记录。COBOL是第一个广泛的编程语言直接支持记录;[6]Algol 68从Cobol那里得到了帕斯卡从Algol 68中获得或多或少地获得了它。常见的LISP提供结构和类(后者通过常见的LISP对象系统)。
- 1959年 - COBOL
01客户记录.03顾客号码图9(8)comp.03顾客姓名.05姓图片X(15).05初始2图片X.05姓图片X(15).03客户地址.05街道.07街道名称图片X(15).09门牌号码图999comp.05城市图片X(10).05国家代码图片X(3).05邮政编码图片X(8).03金额图9(8)comp.
- 1960年 - 阿尔戈尔60
- 1964年 - PL/I
dcl 1基于newtypet(p);2(a,b,c)固定垃圾箱(31),2(i,j,k)浮点,2 r ptr;分配newtypet;
- 1968年 - 阿尔戈尔68
int max = 99;mode newTypet = [0..9] [0..max] struct(long real a,b,c,short int i,j,k,k,ref real r);newtypet newarrayt =(1,2,3,4,5,6,堆真实:= 7)
例如,链接列表可能被声明为:
模式节点=联合(real,int,compl,string),list = struct(节点val,ref list next);
对于Algol 68,只有类型名称出现在平等的左侧,最值得注意的是,构造是从左到右读取的,并且可以读取,而无需考虑优先级。
- 1970年 - 帕斯卡(Pascal)
类型一个=大批[1..10]的整数;b=记录一个,b,c:真实的;i,j,k:整数;结尾;
- 1972 –K&R C
#Define Max 99结构newtypet{双倍的一个,b,c;漂浮r;短的i,j,k;}Newarrayt[10][最大限度+1];
- 1977年 - Fortran 77
Fortran 77具有数组,但缺乏任何正式的记录/结构定义。通常使用复合结构等价或者常见的语句:
特点姓名*32,addr*32,电话*16真实的欠常见的/CUST/姓名,addr,电话,欠
- 1983 - ADA
类型CUST是记录姓名:name_type;addr:addr_type;电话:phone_type;欠:整数范围1。.999999;结束记录;
ADA 95通过标记类型(相当于C ++类)带来了OOP概念,ADA 2012增加了对替代通过全班合同进行验证。
- 1983 - C ++
constint最大限度=99;班级{上市:双倍的一个,b,c;漂浮&r;短的i,j,k;}newtypet[10][最大限度+1];
- 1991 - Python
最大限度=99班级newtypet:防守__在里面__(自己):自己.一个=自己.b=自己.c=0自己.i=自己.j=自己.k=0.0#初始化此类的示例数组。Newarrayt=[[newtypet()为了i在范围(最大限度+1)]为了j在范围(10)]
- 1992 - Fortran 90
阵列和字符串从Fortran 77继承,并引入了一个新的保留词:类型
类型newtypet双重精度一个,b,c整数*2i,j,k*不指针类型参考真实的r最终类型类型(newtypet)t(10,100)
Fortran 90更新并包括Fortran IV称为纳默斯特的概念。
整数::扬=1,2月=2,3月=3,4月=4名单/星期/扬,2月,3月,4月
- 1994年 - ANSI常见的LISP
Common LISP提供结构,ANSI常见的LISP标准添加了关闭类别。
(Defclass一级()(((((f:类型漂浮)(i:类型整数)(一个:类型(大批整数(10))))
有关C/C ++组成的更多详细信息,请参见复合类型.
也可以看看
参考
- ^Yaiser,Michelle。“面向对象的编程概念:组成和聚合”。存档原本的2015年4月8日。
与称为聚合的构图密切相关的概念。在对话中,构图和聚合之间的差异通常被忽略。
- ^设计模式:可重复使用的面向对象软件的元素。Gamma,Erich。,Helm,Richard(计算机科学家),约翰逊,拉尔夫E.马萨诸塞州雷丁:Addison-Wesley。1995。ISBN 0-201-63361-2.OCLC 31171684.
{{}}
:CS1维护:其他(链接) - ^奥斯特曼,克劳斯;Mezini,Mira(2001年10月1日)。“面向对象的构图无缝合”.ACM Sigplan注意到.36(11):283–299。doi:10.1145/504311.504303.ISSN 0362-1340.
- ^一个bOMG(2017)。“统一建模语言规范版本2.5.1”.www.omg.org。 p。 109-110,197-201。检索10月4日,2020.
- ^“聚合”.Windows XP SP2的平台SDK。微软。检索11月4日,2007.
- ^塞贝斯塔,罗伯特·W。编程语言的概念(第三版)。Addison-Wesley Publishing Company,Inc。p。218.ISBN 0-8053-7133-8.
外部链接
- 关联,聚合和组成,2009年2月访问
- HaraldStörrle,UML2,Addison-Wesley,2005年