日期:2012-11-03  浏览次数:20426 次

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 Intege