|
请注意 ...... 著作权所有人:物泽计算机事业股份有限公司、 MISOO对象技术顾问团队、对象导向杂志作者、等。 u本文件摘自 对象导向杂志、精通对象观念与技术等书籍著作。 u本文件仅供您的参阅,请遵守著作权法,不得做其它商业用途。
主题: Whole-Part关系
?????????? 内容 ?????????? v 1. 对象Whole-Part关系 v 2. 组合/部分关系 v 3. 包含者/内容关系 v 4. 集合/成员关系
1. 对象Whole-Part关系
类别继承(Class inheritance)和对象组合(Object composition)是软件再使用(Reuse)的两大法宝。类别继承就是建立父、子类别之关系﹔例如﹐「学生」可分为「大学生」、「中学生」和「小学生」三类别﹐其继承关系图标如下﹕ 图1、 以UML表达类别继承
对象组合的目的是﹕创造「复合对象」(Composite object)﹔例如﹐医院内含医师和护士等﹐其组合关系图标如下﹕
图2、 以UML表达对象组合
继承与组合两大法宝能联合使用﹐以组织庞大的软件系统。例如﹐汽车分为客车、卡车、轿车等子类别﹐而且汽车内含引擎、车体、轮胎等零件﹐则此汽车系统图标如下图3和图4﹕
图3、 汽车的类别继承体系
图4、 汽车的对象组合关系
本节里﹐将进一步分析与说明对象组合方法。尤顿(Yourdon) 认为﹐常见组合关系有三﹕ 1) 组合╱部分(Assembly-parts)关系。 2) 包含╱内容(Container-contents)关系。 3) 集合╱成员(Collection-members)关系。
2. 组合/部分关系
组合/部分关系﹐常称为APO(A part of)关系﹔例如﹐汽车是「组合」﹐其内含各零件是「部分」。门是房子的一部分﹐所以房子是「组合」﹐门是「部分」﹔此外﹐窗子也是房子的「部分」。这房子与门窗之关系﹐图标如下﹕
图5、 房子的对象组合关系
以VB表达如下﹕
''''ex01.bas Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ''''--------------------------------------------------------------------------------- Class House Class Door Public size As Double Public Sub New(ByVal s As Double) size = s End Sub End Class Class Window Public size As Double Public Sub New(ByVal s As Double) size = s End Sub End Class Private dr As Door Private win As Window Public Sub New() dr = New Door(50) win = New Window(100) End Sub Public Sub Show() Messagebox.Show("Door: " + str(dr.size) + " Win: " + str(win.size)) End Sub End Class ''''--------------------------------------------------------------------------------------------------- Public Class Form1 Inherits System.WinForms.Form Public Sub New() MyBase.New() Form1 = Me ''''This call is required by the Win Form Designer. InitializeComponent() ''''TODO: Add any initialization after the InitializeComponent() call End Sub ''''Form overrides dispose to clean up the component list. Public Overrides Sub Dispose() MyBase.Dispose() components.Dispose() End Sub #Region " Windows Form Designer generated code " ...... #End Region Protected Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim h As New House() h.Show() End Sub End Class
以此程序输出如下﹕ Door: 50 Win: 100
House 之对象诞生后﹐立即诞生内含之Door对象和Window对象。例如﹐宣告指令── Dim h As New House()
此时﹐h 对象诞生了﹐其内含之dr 和win对象亦诞生了。
此h 通称为「组合对象」(Composite object)﹐而dr 和win 则称为「部分对象」(Component object)。这种关系具有一项特色﹕组合对象与部分对象的寿命应该是一致的。 在逻辑(Logical)意义上,这House 结构中﹐门和窗随着房子而具有「生死与共」之亲蜜关系,也就是寿命一致。在计算机实体(Physical)表达时,House 之对象并不「真正」包含Door及Window之对象﹐只是利用两个参考指向它们。所以上图也可想象如下:
上述两种实体结构皆表达了「组合/部分」关系。请再看个例子:
''''ex02.bas Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ''''---------------------------------------------------- Class Person Private p_name As String Private p_age As Integer Public Sub New(ByVal na As String, ByVal a As Integer) p_name = na p_age = a End Sub Public Function isEqual(ByVal obj As Person) As Integer Dim k As Integer = 0 If Me.p_name = obj.p_name Then k = 1 End If isEqual = k End Function Public Sub Show() Messagebox.Show(Me.p_name + ", " + str(Me.p_age)) End Sub End Class ''''--------------------------------------------------------------------------------- Public Class Form1 Inherits System.WinForms.Form Public Sub New() MyBase.New() Form1 = Me ''''This call is required by the Win Form Designer. InitializeComponent() ''''TODO: Add any initialization after the InitializeComponent() call End Sub ''''Form overrides dispose to clean up the component list. Public Overrides Sub Dispose() MyBase.Dispose() components.Dispose() End Sub #Region " Windows Form Designer generated code " ......... #End Region Protected Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim a As New Person("Alvin", 35) Dim b As New Person("David", 25) a.Show() b.Show() Messagebox.Show(str(a.isEqual(b))) Messagebox.Show(str(b.isEqual(New Person("David", 32)))) End Sub End Class
此程序输出﹕ Alvin, 35 David, 25 0 1
「组合」对象之建构者New()程序诞生「部分」对象。此a 、b 两对象之内容为﹕
在isEqual()程序里,两个对象拿其p_name 值来比较。例如﹐a.p_name 值是"Alvin" ﹐而b.p_name 值是"David" ﹐所以a.isEqual(b)表达式之值为0 (False)。
3. 包含者/内容关系
上节的House 结构中﹐门和窗随着房子而具有「生死与共」之亲蜜关系。然而﹐日常生活中﹐常见类似但并不如此亲蜜的情形。例如﹐飞行员坐于飞机驾驶仓内开飞机﹔司机在汽车内驾驶汽车﹔客人乘座于巴士内等等。司机不是汽车的零件﹐客人亦非巴士之组件﹐所以汽车与司机之间并非「组合/部分」关系﹔然而﹐汽车的确包含着司机﹐因之称为「包含者/内容」(Container-contents)关系。 司机和汽车为独立之对象﹐不像引擎一直包含于汽车内﹔于驾驶汽车时﹐司机才被包含于汽车内。显然地﹐司机与汽车之寿命不一样长。「包含者/内容」关系是一种特殊的组合结构﹐其图标方法与「组合/部分」关系相同。例如﹐
此图表达了﹕ ◎ 汽车与引擎之间为「组合/部分」关系。 ◎ 汽车与司机之间为「包含者/内容」关系。
以VB表达如下﹕
''''ex03.bas Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ''''---------------------------------------------------- Class Driver Private name As String Public Sub New(ByVal na As [1] [2] [3] 下一页 |