请注意 ...... 著作权所有人:物泽计算机事业股份有限公司、 MISOO对象技术顾问团队、对象导向杂志作者、等。 u本文件摘自 对象导向杂志、精通对象观念与技术等书籍著作。 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 Class
step 2. 定义衍生类别(子类别)。如﹕
Class Teacher Inherits Person ‥‥ End Class Class Student Inherits Person ‥‥ End Class
Inherits字眼之后为父类别名称。它表达了:Teacher 为Person之子类别﹐且 Student为Person之子类别。现在﹐已知道如何表达继承关系了﹔然而﹐子类别从父类别继承什么东西呢﹖类别包含「资料」及「程序」。因之﹐子类别继承父类别之资料及程序。现在﹐请看看如何继承资料及程序。下述程序定义 Person 类别﹐含有 2项资料及 3个程序﹕
''''ex01.bas Imports System.ComponentModel Imports System.Drawing Imports 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 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 mike As Person mike = New Person() mike.SetValue("Mike", 45) mike.Display() Messagebox.Show("BirthYear: " + Str(mike.birthYear())) End Sub End Class
此程序输出如下﹕ Name: Mike Age: 45 BirthYear: 1956
所谓继承资料﹐表示继承资料成员之定义﹐而不是继承资料之值﹐请详加区别之。类别定义资料成员(含型态及名称)﹐对象诞生后﹐对象内才有资料值。所以「类别继承」乃继承类别之定义﹐不是继承对象之值。也就是说﹕若父类别定义name及 age两个资料成员﹐则子类别天生就拥有此两个资料成员﹐所以子类别不需定义它们。所谓继承程序﹐表示子类别天生就拥有父类别定义之程序成员。例如﹕Person的子类别天生就具有 SetValue()、birthYear()及Display()程序。现在﹐就来定义Person之子类别。
''''ex02.bas Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ''''----------------------------------------------------------------------------------------- Public 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 Sub End Class
Public Class Teacher Inherits Person 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 steven As Teacher steven = New Teacher() steven.SetValue("Steven", 35) steven.Display() End Sub End Class
此程序输出如下﹕ Name: Steven Age: 35
表面上Teacher 类别中﹐未定义数据项及程序﹐但事实上已拥有name及 age两个资料成员﹐也拥有 SetValue()、birthYear()及Display() 三个程序成员。因之﹐steven为Teacher类别之对象﹐它能呼叫SetValue()及Display()程序。在应用上﹐子类别通常拥有自己的数据项及程序﹐使其有别于父类别。例如﹕
''''ex03.bas Imports System.ComponentModel Imports System.Drawing Imports System.WinForms ''''------------------------------------------------------------------------------------------------------ Public 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 &n [1] [2] [3] [4] [5] [6] 下一页 没有相关教程
|