日期:2012-07-01  浏览次数:20533 次

主题: 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
is