bsp; Dim x As New Tree()
此时计算机就诞生对象 x。x 能储存此树之资料如下﹕ 如果您想记录别棵树之资料﹐可再宣告Tree类别之对象如下﹕ Dim y As New Tree()
对象 y就可储存此树的资料了。实物上之关系﹕ 树林 <----> 树
树林是一个集合(Set),一棵树是集合里的元素。其表现于计算机程序上是﹕ 类别 <----> 对象
类别是一个集合,一个对象是集合里的元素。 此为 OOP之基本观念。类别设计之优劣常决定软件之生命和价值﹐好的设计其软件寿命源源流长﹐价值连城。类别之设计并非到此为止﹐还要继续做一项重要工作──分类(Classification)﹐亦即寻找「子类别」(Subclass)。例如﹕上述树林中的树若可分为两种──果树与竹子﹐则「树林」类别可分为两个子类别──「果树」与「竹子」。 图5 类别之细分(Refine)
此为实物上之类别关系。程序中的类别关系必须和实物上的情况相呼应。程序中的类别宣告格式为﹕
Class Tree 品种 年龄 高度 End Class Class FruitTree Inherits Tree 成熟月份 价格 End Class
Class Bamboo Inherits Tree 用途 End Class
其中﹐FruitTtree及Bamboo是Tree之子类别(Subclass)﹔而Tree是FruitTree及Bamboo之父类别 (Super Class)。于程序中﹐其关系表示如下──
Class 类别 Inherits 父类别
FruitTree类别中含有两项新特性──「成熟月份」及「价格」。这告诉计算机说﹕对于果树﹐必须多储存两项资料。这两项资料是果树才有的﹐竹子就没有。Bamboo类别中含有一项新特性﹐这告诉计算机说﹕对于竹子﹐必须多储存一项资料──「用途」。这是竹子才有的资料﹐果树则无。例如﹕有一棵果树﹐其资料为﹕
品种﹕peach 年龄﹕8 年 高度﹕2.1 公尺 成熟月份﹕3 月 价格﹕20 元
在计算机中﹐必须宣告FruitTree类别之对象来储存这些资料。欲产生此对象﹐程序可写为﹕ Dim a As New FruitTree()
此时计算机就产生一个FruitTree类别之对象﹐叫 a。它包含5项资料──
其中包含了Tree类别内之 3项资料以及FruitTree类别专有之两项资料。因为Tree为FruitTree之父类别﹐所以FruitTree「继承」(Inherit) 其父类别Tree的 3个特性。
图 6 资料的继承
同理﹐如果有一棵竹子﹐其资料为﹕
品种﹕green 年龄﹕2 年 高度﹕10.0 公尺 用途﹕chopsticks
在计算机中﹐必须宣告Bamboo类别的对象来储存这些资料。欲产生此对象﹐程序可写为﹕ Dim b As New Bamboo() 此时﹐计算机就诞生一个Bamboo类别之对象 b。它可储存 4项资料──
其继承(Inherit) 了Tree类别之 3个特性。
图7 资料的继承 父类别Tree内之资料为子类别── FruitTree 和Bamboo都具有之共同特性。此为OOP 类别设计之基本原则。
5. 对象之行为
树林中的树会长高或变矮(遇台风等)﹐计算机中储存这些资料之对象必须随之改变﹐即对象内之资料会改变。果树的果实售价改变了﹐Fruit_tree类别之对象也须改变﹔这种对象内资料之变化是对象(Object)之「行为」(Behavior)。对象之基本行为包括﹕ (1)把资料送入对象并储存起来。 (2)改变对象内之资料。 (3)拿对象资料来做运算。 (4)从对象中送出资料。
例如﹕30公斤peach之总金额为何﹖此时﹐可拿对象a内之价格资料来做运算──
我们的目的是要拿对象 a中的价格资料(20元)和重量(30公斤)相乘﹐进而算出其总金额(600 元)。然而在OOP 的观念中﹐则必须将其解释为──「把 30 送进对象 a﹐在对象内部做相乘运算﹐然后把总金额 600送出来。」 其中﹐ 600是对象 a接受到外界的「讯息」(Message) 之后﹐才做出的反应﹐至于它的反应过程(乘法运算)则是在对象 a内部完成的。就如同一个电灯泡﹐当电流进入灯泡中﹐此灯泡会发出亮光。这是人们日常府拾可得之经验﹐如果计算机软件像灯泡一样一点就亮﹐不知可多得若干人的芳心呢﹗当你到台北火车站买车票时﹐只需把钱投入售票机中﹐经过一些处理之后﹐就有反应﹕把车票吐出来。
上述之实物对象(如自动售票机)接到讯息(Message) 时﹐其内部产生运作﹐并输出运作之结果。同样地﹐程序内之对象(Object)接到讯息时﹐其内部也对资料做运算﹐并输出运算结果。例如﹐想知道 peach树之高度为何﹖可将此讯息送进对象 a中﹐它会输出此树之高度。
对象对讯息会产生反应﹐但并非对任何讯息都有反应。例如﹕灯泡只会对电流有所反应──发光。自动售票机必须投入钱才会有反应──送出票来。如同一只猫﹐它对一个身边的馒头可能不会有反应﹐但对身旁的老鼠将会出现强烈之反应。 当我们使用灯泡或自动售票机时﹐能轻易学会其使用方法──知道输入什么讯息﹐也很清楚它们的反应。类似地﹐在OOP 程序中﹐你也能轻易学会对象(Object)的使用方法──知道输入什么讯息﹐及了解其反应。所以﹐使用程序内之对象﹐就像使用灯泡一样的简单方便。 换个角度来说﹐如果您是自动售票机之设计人﹐就须负责设计机内之处理过程(反应过程)﹐并使输入讯息更简单﹐而反应更清楚。同理﹐如果您是对象之设计师﹐就得负责设计对象内之运算过程(对讯息的反应过程)﹐并使输入讯息更简单﹐而反应更清楚。
6. 讯息与运算
如果您是手表之设计人﹐则需把电池放入手表中以提供电力。此时﹐您既使用现成之对象──电池﹐也创造新对象──手表。同样的情况﹐写计算机程序时﹐您经常是对象之使用人﹐亦为对象之设计人。因之﹐利用既有而完美之对象去创造更有用之对象﹐乃为OOP 程序员的天职。设计手表时﹐您心理必定很清楚这新手表会有何功能﹐譬如﹕如何设定时间、表示时间(指针或数字)等等。也就是说﹐您一定对这手表将呈现之「行为」(Behavior)有很清晰之构想。其行为包括﹕
(1) 它接受何种「讯息」(Message) ﹖例如﹕按键输入时间。 (2) 对讯息将会有何反应﹖例如﹕显示时间或日期等。
在我们周遭之实物世界中﹐各物体都有其固定之行为﹐所以我们能轻易掌握它﹐且觉得可爱。例如抽烟者常携带的打火机﹐只当用力按它时才有火苗出现﹔一颗手榴弹也在某种动作下﹐才会引爆﹐否则您一定不敢用打火机﹐面对敌人时也不敢用手榴弹。 设计程序中的对象时﹐也得设计它的「行为」﹐决定它将接受何种讯息﹐并且对讯息会产生何种反应。然因您是设计人﹐所以有项必须担任之工作──设计对象内部之运作﹐使它对讯息产生正确的反应。就像您组织手表内部之零件、打火机内部之结构以及手榴弹内部之引爆过程等等。这就是对象设计者之主要工作﹐其目的是﹕让别人有个好用而易于掌握之对象﹗ 以前设计VB程序时﹐在我们心中ㄉ主角是「函数」(Function)或「子程序」(Subroutine)。现在就得把函数摆入对象中﹐让对象有所行为──对讯息有所反应。当您对所设计之对象的行为有清晰的构想之后﹐就自然知道应将那些函数置于对象中。就如同设计手表者依手表的功能决定应有那些零件一般。您去购买现成的零件、创造零件、选择适当的电池﹔接下来就将这些零件组织于手表内。写程序时﹐您使用既有之函数(例如﹕VB 已提供之函数)、创造新函数、也利用既有之对象﹔接下来就将这些函数和对象组织于新对象之中。 至于应如何组织这些函数﹖如何运用现成之对象﹖即为本书之主题了。现在请回到Tree类别之例吧﹗上节里﹐已经诞生对象 a如下﹕
接下来﹐可设计一个函数叫computeAmount(weight)﹐它能求算总金额。如果把这函数加入对象a 中﹐那么对象a 就有如下反应──
如果另设计个函数叫 inquireHeight() ﹐并将之加入对象 a中﹐则对象 a就能输出树之高度﹕
这如同设计灯泡者将钨丝及稀有气体放入其中﹐灯泡才会发光。至于灯泡之使用人就不必为灯泡内部的东西及运作过程而伤脑筋了﹔因之﹐人们会喜欢使用灯泡。灯泡把材料和反应之过程「封藏」(Encapsulate) 于灯泡内﹐您只需把电流(讯息)传入灯泡(对象)中﹐它就发出亮光(反应)。 写程序时﹐您把函数摆入对象中﹐对对象内之资料做运算﹐并且输出结果﹐此时函数内之指令担任这项运算工作。由于函数存于对象内﹐而资料之运算进行于函数内﹔所以﹐运算的过程(亦即反应的过程)就被「封藏」于对象之内。对象之使用人不必为这些函数之运算而伤脑筋﹐也就觉得对象是简单好用。如果计算机软件是由对象组织而成﹐人们就会觉得软件是既简单又好用。就像灯泡可装在车子上﹐也可装在房子内﹐裨构成更大之对象(车子、房子都是对象)。此程序设计观念﹐就称为「对象导向程序设计」。 假设您已把computeAmount(weight)及inquireHeight()两个函数加入对象 a中﹐就可把讯息送给对象a ﹐指令可写为﹕ a.computeAmount( 30 )
这意思是﹕把讯息──computeAmount(30)送给对象 a。此时对象a 内部之computeAmount()函数就会进行运算(把 30 和 20 乘起来)﹐并且送出总金额 600元。您可输入另一讯息﹐指令为﹕ 此时﹐对象 a内之inquireHeight()函数就会进行运算(读取高度── 2.1)并且送出该树之高度﹐亦即 2.1公尺。看看较完整的VB程序吧﹗
Protedted Sub Form1_Click( .... )
上一页 [1] [2] [3] [4] 下一页 [系统软件]14.5.10.1 Object creation expressions [Delphi程序]The Delphi Object Model (PART III) [Delphi程序]The Delphi Object Model (PART II) [Delphi程序]The Delphi Object Model (PART I) [Delphi程序]Object Pascal:从对象指针谈起 [Delphi程序]Object Pascal Style Guide [Delphi程序]Object TreeView简要说明 [Delphi程序]Object Pascal中String类型的内幕探讨 [Delphi程序]delphi学习笔记(2)-object pascal语言的语句 [Delphi程序]delphi学习笔记(1)-object pascal语言的数据类…
|