分享
 
 
 

VB.Net中文教程(9) 重新定义(Overriding)程序

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

请注意 ......

著作权所有人:物泽计算机事业股份有限公司、

MISOO对象技术顾问团队、对象导向杂志作者、等。

u本文件摘自 对象导向杂志、精通对象观念与技术等书籍著作。

u本文件仅供您的参阅,请遵守著作权法,不得做其它商业用途。

主题: 重新定义(Overriding)程序

?????????? 内容 ??????????

v 1. 重新定义程序

1. 重新定义(Override)程序

在应用上﹐常见如下之情况﹕子类别从父类别继承之程序﹐并不合乎子类别之需要。此时可设计新程序取代之。

图1、程序成员之重新定义

例如﹐SalesPerson类别含有Bonus()程序﹔SalesManager由 SalesPerson继承而得Bonus()程序。Bonus()能计算销售人员之红利。然而﹐一般销售员与销售经理之红利计算方法不同﹔所以﹐SalesPerson之Bonus()显然并不适用于SalesManager。这SalesManager类别必须定义适用的Bonus()求算销售经理之红利。子类别不满意继承之程序而自行定义程序取代之﹐此情形称为「再定义」(Redefinition)或「重新定义」(Overriding)。自行定义程序与继承程序之名称相同。请看个程序﹕

'ex01.bas

Imports System.ComponentModel

Imports System.Drawing

Imports System.WinForms

'-----------------------------------------------------------------------------------------

Class SalesPerson

Protected totalSales As Double

Public Sub New(ByVal t As Double)

totalSales = t

End Sub

Public Overridable Function Bonus() As Double

Bonus = totalSales * 0.008

End Function

End Class

Class SalesManager

Inherits SalesPerson

Public Sub New(ByVal t As Double)

MyBase.New(t)

End Sub

Public Overrides Function Bonus() As Double

Bonus = totalSales * 0.008 + 1000

End Function

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 Jim As New SalesPerson(50000)

Messagebox.Show("Jim's Bonus: " + str(Jim.Bonus()))

Dim Tom As New SalesManager(45000)

Messagebox.Show("Tom's Bonus: " + str(Tom.Bonus()))

End Sub

End Class

此程序输出如下﹕ Jim's bonus: 400

Tom's bonus: 1360

因Jim为SalesPerson类别之对象﹐则Jim.Bonus()所指的是SalesPerson之Bonus()程序。SalesManager类别继承此Bonus()﹐且自己定义新的Bonus()程序。此新程序取代了继承之程序。因之﹐Alvin.Bonus()是指SalesManager自己定义之Bonus()程序。

「重新定义」(Overriding)的过程中﹐必定也产生「重复定义」(Overloading) 之现象。前者是针对「父子」类别之间﹐子类别有「修正」(Refinement)或「取代」(Replacement) 之意味时﹐才定义同名称之程序来取代父类别之程序。至于重复定义则范围较广﹐在类别内也能重复定义程序﹐父子类别之间也能重复定义程序﹐甚至互为独立的两类别之间也能发生重复定义之现象﹔重复定义之后新程序与原程序之间﹐在「涵义」(Semantic)上仅类似,但并不必然相同,例如Bonus(ByVal y As Year)与Bonus(ByVal y As Employee)两者涵义不尽相同。

然而重新定义程序﹐例如上述的 SalesPerson例子中﹐父类别SalesPerson.Bonus()和子类别SalesManager.Bonus()皆表示同一涵义──求算红利﹐只是计算方法不同罢了。因之﹐「重新定义」着眼于以不同的执行过程来取代父类别之程序﹐但新旧程序之间﹐具有一致的意图。盼您能区分这易于混淆的概念。请再看个程序:

'ex02.bas

Imports System.ComponentModel

Imports System.Drawing

Imports System.WinForms

'--------------------------------------------------------------------------------------

Public Class Person

Private name As String

Private age As Integer

Public Sub New(ByVal na As String, ByVal a As Integer)

name = na

age = a

End Sub

Public Function birthDay() As Integer

birthDay = 2001 - age

End Function

Public Overridable Sub Display()

Messagebox.Show("Name: " + name + " Age: " + str(age))

End Sub

End Class

Public Class Teacher

Inherits Person

Private salary As Decimal

Public Sub New(ByVal na As String, ByVal a As Integer, ByVal sa As Decimal)

MyBase.New(na, a)

salary = sa

End Sub

Public Overrides Sub Display()

MyBase.Display()

Messagebox.Show("Salary: " + str(salary))

End Sub

End Class

Public Class Student

Inherits Person

Private student_number As Integer

Public Sub New(ByVal na As String, ByVal a As Integer, ByVal no As Integer)

MyBase.New(na, a)

student_number = no

End Sub

Public Overrides Sub Display()

MyBase.Display()

Messagebox.Show("StudNo: " + str(student_number))

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 x As New Teacher("Linda", 33, 50500)

Dim y As New Student("Tom", 36, 11138)

x.Display()

y.Display()

End Sub

End Class

此程序输出:

Name: Linda Age: 33

Salary: 50500

Name: Tom Age: 36

StudNo: 11138

Person的Display()不能显示出Teacher的salary资料,所以Teacher必须「修正」Person原有的Display()程序。同样地,Student类别也「修正」Person原有的Display()程序。n

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有