请注意 ......
misoo对象技术顾问团队.对象导向杂志作者.等. 【程序编程相关:透视和调整你的企业和商务系统(Ⅴ:Sol】著作权所有人:物泽计算机事业股份有限公司. 【推荐阅读:在你的VB.NET应用程序中使用多线程】u本文件仅供您的参阅,请遵守著作权法,不得做其它商业用途. 【扩展信息:C#聊天程序】u本文件摘自 对象导向杂志.精通对象观念与技术等书籍著作. 主题: 类别继承(inheritance)关系 ?????????? 内容 ??????????v 1. 定类别之继承v 2. 定义继承关系v 3. 藉「继承」扩充程序1. 类别之继承
类别之间﹐有些互为独立﹐有些具有密切关系.兹介绍类别间常见的关系──「父子」关系﹔由于儿女常继承父母之生理或心理特征﹐所以又称此关系为「继承」(inheritance) 关系.类别间之密切关系﹐把相关的类别组织起来﹐并且组织程序内之对象.若程序内之对象毫无组织﹔呈现一片散沙﹐就不是好程序.完美之vb程序﹐必须重视类别间之关系﹐对象是有组织的.
如果 a类别「继承」 b类别﹐则称 a为「子类别」(subclass)﹐也称b 为「父类别」(superclass)﹐亦即 b为 a之父类别﹐a 为 b之子类别.在 c++中﹐父类别又称为「基础类别」(base class)﹐子类别又称为「衍生类别」(derived class) .也许您觉得「继承」之观念很陌生﹐不知如何看出类别间之继承关系.别担心﹐有个简单方法﹕下列两叙述之意义相同── (1) a 为 b之子类别. (2) a 为 b之一种(a kind of) 特殊类别.根据叙述 (2)能轻易找到父子关系.例如﹕肯尼士(kennex)生产高品质球拍﹐球拍分两种﹕网球拍与羽球拍.从此句子得知﹕网球拍为一种(a kind of) 球拍﹐羽球拍亦为一种球拍.因之﹐网球拍为球拍之子类别﹐羽球拍亦为球拍之子类别﹐亦即球拍是父类别.以下图标之﹕
图1. 基础类别与衍生类别
如果设计程序来记录球拍之生产情形﹐则程序应定义基础类别──球拍﹐以及两衍生类别──网球拍及羽球拍.程序应藉继承关系将三类别组织起来.除了物品(如球拍.汽车等)外﹐人也有继承关系.例如﹕学校人员包括学生.老师及职员﹐老师又分为专任老师及兼任老师.学校的人事软件系统﹐应定义类别关系如下﹕
图2. 三代继承关系程序不仅要定义类别﹐也要定义其继承关系.
2. 定义继承关系
前面各章里﹐已介绍如何定义类别﹔本节将告诉您如何定义类
别之继承关系.兹举例说明之﹕
程序的设计过程是﹕
step 1. 定义基础类别(父类别).如﹕class person
‥‥ end classstep 2. 定义衍生类别(子类别).如﹕
class teacher
inherits person ‥‥ end class class student inherits person ‥‥ end classinherits字眼之后为父类别名称.它表达了:teacher 为person之子类别﹐且 student为person之子类别.现在﹐已知道如何表达继承关系了﹔然而﹐子类别从父类别继承什么东西呢﹖类别包含「资料」及「程序」.因之﹐子类别继承父类别之资料及程序.现在﹐请看看如何继承资料及程序.下述程序定义 person 类别﹐含有 2项资料及 3个程序﹕
ex01.bas
imports system.componentmodelimports system.drawingimports system.winforms-----------------------------------------------------------------------------------------class person private name as string private age as integer public sub setvalue(byval na as string, byval a as integer) name = na age = a end sub public function birthyear() as integer birthyear = 2001 - age end function public sub display() messagebox.show("name: " + name + " age: " + str(age)) end subend 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 mike as person mike = new person() mike.setvalue("mike", 45) mike.display() messagebox.show("birthyear: " + str(mike.birthyear())) end subend class此程序输出如下﹕
name: mike age: 45birthyear: 1956 所谓继承资料﹐表示继承资料成员之定义﹐而不是继承资料之值﹐请详加区别之.类别定义资料成员(含型态及名称)﹐对象诞生后﹐对象内才有资料值.所以「类别继承」乃继承类别之定义﹐不是继承对象之值.也就是说﹕若父类别定义name及 age两个资料成员﹐则子类别天生就拥有此两个资料成员﹐所以子类别不需定义它们.所谓继承程序﹐表示子类别天生就拥有父类别定义之程序成员.例如﹕person的子类别天生就具有 setvalue().birthyear()及display()程序.现在﹐就来定义person之子类别.... 下一页