html5中文学习网

您的位置: 首页 > 网络编程 > ASP.NET » 正文

VB.Net中文教程(8) 对象(Object)基本概念_.NET教程_编程技术

[ ] 已经帮助:人解决问题
object|对象|概念|教程|中文
主题: 对象(Object)基本概念

???????????? 内容 ????????????
v 1. 何谓「对象导向」?
v 2. 认识与寻找对象
v 3. 对象之分类与组织
v 4. 类别之设计
v 5. 对象之行为
v 6. 讯息与运算
v 7. 类别之定义
v 8. 着手写 VB程序

大地运转、花开花谢、及枫叶飘零 ...... 是自然界对象之行为。对象行为交互作用造成多采多姿的大自然。软件的对象是自然界对象的抽象表示,软件就逼真地表达自然界的实际景象于是人们心中构思的软件和眼中所见到的世界是一致的。软件是自然界实况的抽象简单明了能帮助人们了解和掌握真实景物。本文介绍VB的对象观念,让您轻易以VB描述身边美丽多变的世界。 ----- 摘自 高焕堂 的文章

1. 何谓「对象导向」

在企业上常有「行销导向」及「技术导向」之名词行销导向讲得更通俗一点就是行销挂帅亦即行销观念为整个企业营运计划之核心。而技术挂帅就是以技术创新为公司活动之核心。同样地在软件开发方面传统 C语言之核心观念是「函数」(Function)进而让函数之间可互相呼叫并传递数据。在 COBOL程序中大部分的程序设计工作摆在 COBOL程序的程序部(Procedure Division)中进而让段(Paragraph) 之间互相呼叫(Perform) 。当您看到 C程序时脑海里充满着函数的影子当您想到 COBOL程序时心理也充满段、节等观念就像我们想到或看到万里长城时马上联想到它是由许多石块所构成一般。因之传统的程序设计是「函数导向」(Function-Oriented) 或称为「程序导向」(Procedure-Oriented)着重于计算机处理资料时的执行过程。
后来资料导向观念出现了资料在经过程序的处理后会有所改变这转变的途径成为软件设计过程中注意力的集中点这称为「数据导向」(Data-Oriented) 。
现在的「对象导向」(Object-Oriented) 观念在软件开发时甚至写程序时对象(Object)成为脑海里的主角。当您看到程序时心理充满着对象之影子和概念函数和资料变成对象内之一部分是配角而非主角了。程序设计之核心工作在于描述对象、组织对象、安排对象间之沟通(传递讯息)方式。就如同「人」是社会中的主要对象社会是有组织的人群人们之间会互相沟通、协调。
由于软件中的对象观念和实际社会中的对象观念是一致的所以 OOP观念使软件与实际世界间之距离缩短了。此为 OOP技术的重要特点之一。例如函数或程序导向之核心观念──函数在一般人们的心目中并非熟悉之概念只在数学里学到之概念而已。因而让人对软件感到陌生。而在对象导向观念中实际社会之对象例如人、汽车、股票、磁盘驱动器、帐单、房间、学生、教室等皆为软件设计师脑海中的对象也是程序中的对象。因之不论是老板或程序设计师来看程序他们脑海中皆充满对象之影子而这些个体皆为人们生活中真正活生生的东西、实在之物体或大家耳熟能详之概念使得软件之使用者和设计者有一致的心灵、共同之感觉这让使用者对软件更满意设计师更了解使用者之需要。


2. 认识与寻找对象
着手设计一个系统或写一个程序时第一件会出现在脑海中的问题是对象那么多何者是跟此系统或程序有关的呢例如在设计一个销售系统时「顾客」是一重要对象产品及订单也是重要对象至于原料之产地及原料之供货商虽然是明显的对象但不见得与销售系统有关。反之若您所设计的是采购或生产系统时原料、产地及其供货商就跃然成为重要对象了。在寻找对象之过程中也会让您对所要设计的系统有更清楚之认识。
现在就来介绍较实用之找对象方法。其中最常见的是从有关文件着手。在文件里会发现下述线索再进而找出对象。
(1) 人(People)──人是任何系统之重要角色通常是最容易找到之对象。例如公司有 5位销售员各负责一个地区的任务并与该区的顾客连络。从这段叙述中就可发现两种对象──销售员及顾客每一位销售员皆是对象同样地每一个顾客皆是对象。
(2) 地方(Sites) ──地点是很容易发现之对象。例如您从订单上看到产品将送达之目的地、顾客之所在地。再拿旅行社行程来当例子各旅行团将于不同之观光地区停留各观光地点皆是对象。
(3) 事物(Things)──在可摸到或看到的实物中也容易找到与系统有关之对象例如产品是销售系统及生产系统之明显对象原料项目是生产及库存系统之重要对象。就旅馆管理系统而言「房间」是重要对象。「书本」及「杂志」为图书馆或书店管理系统之明显对象。
(4) 事件(Events)──在企业界最常见之事件是「交易」当事件发生时我们会去记录它发生的时刻、有关金额等等。这种我们所关心的事件也常是重要之对象。值得注意的是这些事件是已发生的其为一项行为或动作。所以在文件中常是一个句子的动词。例如今天共有 3种原料已降至安全存量之下所以共订购 3种原料。这每一「订购」(Ordering)事件皆是对象。就飞机场的控制系统而言每次飞机「起飞」或「降落」 皆是重要对象。而「提款」及「转帐」皆为银行系统之重要对象。「挂号」及「就诊」为医疗系统之对象。
(5) 概念(Concepts)──与企业营运或机构管理有关之「构想」或各种「计划」或其它观念这些无形的但决定企业活动之构想常是重要对象。例如公司正拟定三种广告策略其中每一策略就是企业行销系统之重要对象。这公司正透过 2种管道与社区居民沟通这管道也是概念性之对象。
(6) 外部系统或设备(External Systems or Devices) ── 软件系统常会与其它系统沟通互相交换信息。有时也由外部设备取得交易资料或把处理结果送往外部设备。这些外部系统或设备也是对象。例如库存系统与采购系统会互相沟通对库存系统而言采购系统是对象反之对采购系统而言库存系统则为对象。如果收款机直接把交易资料传送给销售系统则收款机是此销售系统之对象。如果股票系统直接把资料传送到交易市场的电视显示屏上则对股票系统而言电视显示屏是对象。
(7) 组织单位(Organization Units)──企业机构之部门或单位。例如在学校管理系统中教务处及训导处等单位皆是对象。
(8) 结构(Structures)──有些对象会包含其它对象。所以在对象中常能找到其它对象。例如在学校的组织单位──教务处含有小对象如注册组及学籍股等。在汽车对象中可找到引擎、轮胎及座椅等对象。在「房屋」对象中会发现到厨房、客厅、沙发等对象。

以上介绍的是常用之寻找对象方法会寻找对象之后就必需将对象分门别类并且了解类别间之关系以便把它们组织起来。例如在公司的人事结构中可发现人因扮演角色之不同而分为不同种类之对象如推销员、司机、经理等等。汽车可分为跑车、巴士、旅行车等不同种类之对象。如何分类(Classification)是OOP 之重要观念。


3. 对象之分类与组织
3.1 类别的永恒性
俗语说物与类聚。「物」和「类」说明对象与其所属「类别」(Class) 之关系相似之对象常归为一类。例如一个人是对象人类是由个人所构成之类别。「狗」这种动物是类别我家那只哈巴狗是对象。当您获知公司有 A、B 两位推销员时可得知 A、B 两者皆为对象同时也联想到「推销员」(Salesman)是类别而 A、B 皆是此类别内之对象。
由于类别比对象较具有永恒性在设计软件的过程中当您找到对象时也必须掌握此对象之类别如此软件自然会更具有永恒性亦即软件的寿命会更长。例如一个人从出生到老不超过二百年而「人类」则因对象生生不息而永远昌隆。在学校里King老师会换工作而离开学校但「老师」类别将永远存在。因之个体及其所属的群体──类别皆是 OOP之核心观念。善于利用类别把对象归类并且组织起来是对象导向软件开发的重要技术。在设计软件时通常必须先决定有关的类别并且弄清楚类别之间的关系。兹介绍两种最常见之类别关系「父子关系」和「整体部分关系」。

3.2 父子类别关系
人们从小就学习对东西分类将东西分为「生物」及「无生物」其中生物又分为「动物」及「植物」等。无论动物、植物或生物皆为类别(Class) 。动物是一种(a kind of) 生物植物也是一种生物。此时即称动物是生物的子类别(Subclass)植物也是生物的子类别而生物是动物及植物的父类别(Superclass)。这种父子类别关系是软件中的组织相关对象的重要方法。例如汽车、马车、脚踏车皆为一种车所以车是父类别而汽车、马车及脚踏车皆为车之子类别。
设计软件时当您知道公司今天生产 5部巴士及 5部轿车时您已找到10个对象了其中每一部车皆为对象。它们分别属于不同类别──巴士及轿车然而因巴士及轿车皆为一种(a kind of)汽车所以轻易地找到其更大的类别──汽车。利用父类别──汽车把两个子类别──巴士及轿车组织起来其关系可表示如下:


图1 父子关系

于是在我们所设计的软件中将包含这三种类别。
日常生活中父子关系是很常见的类别关系经由这种关系也很容易决定与软件有关的类别。例如一家公司正在生产 3种鞋子──网球鞋、篮球鞋及慢跑鞋。此时我们已找到了 3种类别──网球鞋、篮球鞋及慢跑鞋。由于网球鞋及篮球鞋皆为一种球鞋所以进而找到父类别──球鞋。球鞋及慢跑鞋皆为一种鞋子所以又找到了它们的父类别──鞋子。因之得到关系如下

图 2 多层父子关系

如果为这家公司设计软件这 5种类别是软件中的重要类别同时这种父子类别关系正是软件用来组织有关对象(各双鞋子)的好方法。由于软件设计者的脑海中对象的组织方法和一般管理者脑海中的分类方法是一致的这能使软件更适切地满足使用者的需要也提高了软件的价值。

3.3 整体部分关系
上节谈过对象常包含其它对象从对象之结构(Structure) 能找到其它对象。例如一部汽车含一个引擎及 4个轮胎。


图3 对象之整体部分关系

从这对象结构发现到两类别──引擎及轮胎。其类别关系为


图4 类别之整体部分关系

引擎是汽车的一部分(A Part Of) 轮胎是汽车的一部分所以汽车是「整体」(Whole) 而引擎及轮胎是「部分」(Part)。
在实际的产品结构中常见整体部分关系。例如灯泡含灯心、灯帽及玻璃球书本含封面、目录及内容等部分计算机系统含屏幕、键盘、主存储器及磁盘驱动器等等。在软件设计时也常依照这结构来组织类别及对象。例如在程序中就可定义汽车、引擎及轮胎三种类别。
请注意上述关系其整体与部分间有共生共灭之密切关系。例如一个灯泡破了或者烧坏了通常整个灯泡包括其内部的灯帽、灯心、玻璃球一齐都被丢弃了。于是在软件系统中这些部分对象(如灯心)皆会随着整体对象(灯泡)之消失而一起消失了。反之司机对汽车而言是不可或缺的但没有人认为司机是汽车的组件原因是一部汽车报销了司机可还存在呢然而司机仍是汽车的一部分因为在空间上汽车对象中仍包含了司机对象。因之汽车与司机之间仍是整体部分关系。



这种关系也很常见例如笔心是自动铅笔的一部分但笔心并不与铅笔共生共灭。同样地干电池是手电筒的一部分但两种对象并非共生共灭。这种整个部分的关系也让我们很容易找出相关的对象和类别同时也能利用这种关系来把软件中的对象组织起来。
上述两种关系是实体物之间的整体部分关系。然而在概念性的对象或类别之间也常见整体部分关系这些经常是企业活动或计划之概念性对象。例如在旅行社中旅行团的行程常分为数段每一段行程是总行程的一部分。



由于企业营运计划常为企业管理的核心工作而计划或活动经常由数个更小的计划或活动所构成。所以在 OOP技术中常用整体部分关系来表示这种概念性类别之关系。
再从企业机构的组织来看一个组织(Organization)经常有其成员(Member)这组织与成员之间也是整体部分关系。例如一个公司分为数个部门每一部门又数个职员则部门是一组织而职员是该组织的成员亦即部门与职员是整体部分关系。



由于公司包含数个部门所以公司与部门之间也是整体部分关系。此外职员也是公司的成员所以公司与职员之间也是整体部分关系。



由于组织与成员之间关系是府拾可得之整体部分关系极为常见因之经由这种关系可找到有关之对象及类别。在设计软件时可别忘了掌握此重要关系。事实上软件也应表达出这种关系才能使得软件中的对象结构与实物世界中的对象结构一致。
在对象导向程序设计之过程中通常先于程序中定义有关之类别再利用已定义之类别来诞生对象来与实物世界中的对象相对应以便让软件更贴切地表示实际的系统之需求。因之在找到对象之后(其方法如上节所述)就确定它们的所属类别。确定了这些基本的类别之后就经由「父子关系」找出有关的父类别或子类别并且确定这些类别之间的关系。再接下来就是利用对象之间的整体部分关系来找出相关的对象并进而找出相关之类别并且确定这些类别之间的关系。
本书里将以 VB.net语言来说明如何运用类别来组织对象并像建造万里长城般有系统地将对象组织起来形成既可靠又好用的现代软件。



4. 类别之设计

对象导向程序设计(Object-Oriented Programming 简称 OOP)之观念能大量简化计算机软件之复杂度让人们更容易发展及维护软件。OOP 的两个最基本观念是类别(Class) 及对象(Object)。俗语常说「见树不见林」或「见林不见树」其中的林就是「类别」而林之组成元素──树就是「对象」了。依传统之程序写法主要之程序设计工作是在于设计指令、叙述及函数等等然而在OOP 之新观念中写程序的主要工作在于──设计类别亦即「造林」之工作。设计各式各样之类别后再做「雕材」的工作对树木做各种运用亦即使用类别之对象而产生有价值之信息。请看如何设计一类别叫──Tree(树林)其格式为

Class Tree
品种
年龄
高度
End Class

此告诉计算机对于树林中的树将记录其 3种特性(Attribute) ──品
种、年龄及高度。例如有一棵树其特性为

品种peach
年龄8 年
高度2.1 尺

这是树林中的一棵树在计算机的Tree类别中就必须有一「对象」(Object)和它对应并且储存它的特性。至于如何产生Tree类别之个体呢其指令为

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( .... )
Dim amount As Double
Dim height As Double
Dim a As New FruitTree( "peach", 8, 2.1, 3, 20 )
amount = a.computeAmount( 25 )
height = a.inquireHeight()
Messagebox.Show("Amount= " + str(amount) + "Height= " + str(height))
End Sub

此程序中对象 a首先接到一讯息──computeAmount(25)对象a 就会激活其内部的computeAmount()函数此函数就拿25和对象中的价格20相乘函数计算完毕得到 500对象 a就将其送出来。


计算机再将 500存入amount变量之中则amount之值是 500。接下来对象 a又接到另一讯息──inquire_height()对象 a激活其内部的inquire_height()函数此函数就读取对象内的「高度」──2.1 且把 2.1送出来。


计算机将 2.1存入height变量之中则height之值为 2.1。最后计算机把amount及height变量之值显示于屏幕上──
Amount = 500 Height = 2.1


7. 类别之定义

一只猫是对象(Object)不同的猫其大小、颜色各不相同但是它们有很多相同之行为您才认为它们是猫也才将它们归于同一类譬如喜欢捉老鼠、善于爬树、怕水等等。因之归于同类别之对象具有共同的行为(Behavior)亦即各对象对讯息(Message) 之反应过程是相同的这反应过程可由同一函数担任。例如下述指令产生 a及 k两对象──

Dim a As New FruitTree("peach", 8, 2.1, 3, 20)
Dim k As New FruitTree("pineapple", 2, 0.5, 6, 10)

假设其内部资料为





因 a及 k是同类别之对象所以对同一种讯息的反应过程是一样的但由于对象内部的资料并不相同其反应的结果有所不同。









对于讯息──computeAmount(25)而言对象 a会激活computeAmount()函数处理它而对象 k也激活computeAmount()处理它其处理过程是相同的。也就是说对象 a和 k共享computeAmount()函数来处理这讯息。此computeAmount函数可写成



Function computeAmount(重量)
computeAmount = 重量 * 价格
End Function

于是把这函数加入FruitTree类别中──

Class Tree
品种
年龄
高度
End Class

Class FruitTree
Inheits Tree
成熟月份
价格
Function computeAmount(重量)
computeAmount = 重量 * 价格
End Function
End Class

Class Bamboo
Inherits Tree
用途
End Class

如此FruitTree类别之各对象都对computeAmount(25)讯息有所反应各对象皆使用这computeAmount()函数来处理此讯息。您可认为各对象共享computeAmount()函数也能认为每对象内皆有一份computeAmount()函数以便处理这种讯息。接下来继续将inquireHeight()函数加入FruitTree类别中──

Class Tree
品种
年龄
高度
End Class

Class FruitTree
Inherits Tree
成熟月份
价格
Function computeAmount(重量)
computeAmount = 重量 * 价格
End Function
Function inquireHeight()
inquireHeight = 高度
End Function

Class Bamboo
Inherits Tree
用途
End Class

于是FruitTree类别之对象具有同样的行为──对computeAmount()和inquireHeight()讯息有所反应且反应过程也相同只是反应结果有所不同。写程序时可认为FruitTree类别之对象共同享用computeAmount()及inquireHeight()函数。也可认为各对象内各有一份computeAmount()函数及一份inquireHeight()函数以便处理这两种讯息。






请看个主程序

Protedted Sub Form1_Click( .... )
Dim amount As Double
Dim height As Double
Dim a As New FruitTree( "peach", 8, 2.1, 3, 20)
Dim k As New FruitTree( "pineapple", 2, 0.5, 6, 10)
amount = a.computeAmount( 25 )
height = a.inquireHeight()
Messagebox.Show("Amount= " + str(amount) + "Height= " + str(height))
amount = k.computeAmount( 25 )
height = k.inquireHeight()
Messagebox.Show("Amount= " + str(amount) + "Height= " + str(height))
End Sub

因FruitTree类别含有computeAmount()及inquireHeight()两函数所以对象 a及 k皆能接受这两种讯息并处理之。至于其它的讯息因无函数来支持(处理)FruitTree之对象无法接受之。您可继续把新函数加入FruitTree类别中使其对象拥有更丰富之行为亦即能接受更多样化之讯息。换句话说对象之功能就更多了。上述程序输出如下

Amount = 500 Height = 2.1
Amount = 250 Height = .5
8. 着手写 VB.net程序

上节之主程序中我们是假设对象 a及 k之内部已有资料了。也许您想问道如何把资料存入对象内呢很简单当您有这种需要时就设计一个函数并加入类别中由它担任资料的输入工作。资料输入对象中也是对象之行为一旦您将此函数加入类别之后对象就能接受讯息并且处理它。以下的实际VB程序让您了解详细的情形了。这程序叫oop01-01:

'ex01.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
'-----------------------------------------------------------------
Class Tree
Public varity As String
Public age As Integer
Public height As Double
End Class

Class FruitTree
Inherits Tree

Public month As Integer
Public price As Double
Public Function computeAmount(ByVal weight As Single) As Double
computeAmount = weight * price
End Function
Public Function inquireHeight() As Double
inquireHeight = height
End Function
Public Sub SetPrice(ByVal pr As Double)
price = pr
End Sub
Public Sub SetHeight(ByVal hei As Double)
height = hei
End Sub
End Class

Class Bamboo
Inherits Tree

Public usage As String
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 FruitTree()
Dim k As New FruitTree()
a.SetPrice(20)
a.SetHeight(2.1)
k.SetPrice(10)
k.SetHeight(0.5)
Dim amount As Double
Dim height As Double

amount = a.computeAmount(25)
height = a.inquireHeight()
Messagebox.Show(str(amount) + "元 , " + str(height) + "公尺", "结果")
amount = k.computeAmount(25)
height = k.inquireHeight()
Messagebox.Show(str(amount) + "元 , " + str(height) + "公尺", "结果")
End Sub
End Class

当您把这程序输入计算机并利用VB执行它则计算机输出结果如下

500元, 2.1公尺
250元, .5公尺

请注意这程序中有数个public专用字此刻您不要为它们而伤脑筋此后各章将详细说明之。现在您必须了解之重点是

(1) 如何表明您所设计之类别以及类别之间的父子关系。
例如类别关系是


在程序里从上层类别开始依照由上而下之顺序逐一把各类别叙述清楚。各类别所属之数据项(变量)也得说明清楚。

(2) 如何把函数加入类别中以支持对象之行为使对象能接受讯息、进行运算并输出结果。
例如FruitTree已加入 4 个函数使得Fruit_tree类别之对象能接受并处理 4种讯息。


为了让对象能接受并处理讯息必须把适当的函数加入类别中因之类别内含有两种重要成份──

1.数据项
2.函数

我们称这数据项为类别之「资料成员」(Data Member) 并称这函数为类别之「成员函数」(Member Function)。例如:FruitTree类别含两个资料成员──

成熟月份
价格

FruitTree类别含 4个成员函数──

computeAmount()
inquireHeight()
SetPrice()
SetHeight()

(3) 如何产生对象。
如果您把类别视为一种资料型态(Data Type )那就轻而易举了。想产生两个FruitTree类别之对象就写指令如下

Dim a As New FruitTree()
Dim b As New FruitTree()

能以两种方法了解上述之指令

1. 把FruitTree视为类别则a, k就是对象则此指令就宣告两个「对象」(Object)。
2. 把FruitTtree视为一种资料型态(Data Type) 则 a , k 就是FruitTree型态之变量则此指令宣告两个「变量」(Variable)。

综合上述两种看法您可认为FruitTtree是一种「型态」a 和k 是「变量」而类别型态之变量就是「对象」(Object)。

(4) 对象中含有那些资料。
类别的父子关系决定了对象之「继承」(Inheritance) 关系也决定对象中所含有之数据项。例如FruitTree是Tree之「子类别」(Subclass)则FruitTree类别之对象继承Tree类别内之数据项。所以指令──

Dim a As New FruitTree()

产生了对象 a它含有 FruitTree 类别内之「资料成员」也含有Tree类别内之「资料成员」。



(5) 如何把讯息送给对象。
讯息与对象之关系可表示如下



程序的写法为


例如 a.SetPrice( 20.0 )
及 a.SetHeight( 2.1 )

当计算机执行了这两个指令亦即对象 a接受到这两个讯息则 a之内容会有所变化对象内部之变化也是一种行为是对象对讯息之反应。此时Tree类别的height值为 2.1price 值为 20.0 。如果想把传回之结果存入变量中程序写法为


例如


当计算机执行这两个指令即把此二讯息送给对象 a则 a会传回值并经由 "="运算而存入变量中。于是amount值为 500元而height值为 2.10 公尺。


习题
[1]「马上相逢无纸笔凭君传语报平安」在此句话中牵涉到几个「人」对象呢其传递了什么讯息其讯息对这些「人」对象之行为会有何影响呢
[2] 林老师请小芳打电话向小美说「祝你生日快乐」。可表示如下
小美. 打电话(「祝您生日快乐」)
或者 小芳. 请打电话(小美「祝您生日快乐」)
或者 林老师. 打电话(小芳小美「祝您生日快乐」)
何者较合理理由何在
[3] 有对男女朋友互相询问对方的母亲的生日该如何表达其讯息传递情形呢
[4] 当您要求银行人员替您算出某帐户本月的利息时其讯息可表示为
银行人员. 计算利息(帐户)
或者 帐户. 计算利息()
何者较合理呢

FbUHTML5中文学习网 - HTML5先行者学习网
FbUHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助