VB.Net中文教程(9) 重新定義(Overriding)程序
2024-07-10 13:02:42
供稿:網(wǎng)友
主題: 重新定義(overriding)程序
?????????? 內(nèi)容 ??????????
v 1. 重新定義程序
1. 重新定義(override)程序
在應(yīng)用上﹐常見如下之情況﹕子類別從父類別繼承之程序﹐并不合乎子類別之需要。此時可設(shè)計新程序取代之。
圖1、程序成員之重新定義
例如﹐salesperson類別含有bonus()程序﹔salesmanager由 salesperson繼承而得bonus()程序。bonus()能計算銷售人員之紅利。然而﹐一般銷售員與銷售經(jīng)理之紅利計算方法不同﹔所以﹐salesperson之bonus()顯然并不適用于salesmanager。這salesmanager類別必須定義適用的bonus()求算銷售經(jīng)理之紅利。子類別不滿意繼承之程序而自行定義程序取代之﹐此情形稱為「再定義」(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)的過程中﹐必定也產(chǎn)生「重復(fù)定義」(overloading) 之現(xiàn)象。前者是針對「父子」類別之間﹐子類別有「修正」(refinement)或「取代」(replacement) 之意味時﹐才定義同名稱之程序來取代父類別之程序。至于重復(fù)定義則范圍較廣﹐在類別內(nèi)也能重復(fù)定義程序﹐父子類別之間也能重復(fù)定義程序﹐甚至互為獨立的兩類別之間也能發(fā)生重復(fù)定義之現(xiàn)象﹔重復(fù)定義之后新程序與原程序之間﹐在「涵義」(semantic)上僅類似,但并不必然相同,例如bonus(byval y as year)與bonus(byval y as employee)兩者涵義不盡相同。
然而重新定義程序﹐例如上述的 salesperson例子中﹐父類別salesperson.bonus()和子類別salesmanager.bonus()皆表示同一涵義──求算紅利﹐只是計算方法不同罷了。因之﹐「重新定義」著眼于以不同的執(zhí)行過程來取代父類別之程序﹐但新舊程序之間﹐具有一致的意圖。盼您能區(qū)分這易于混淆的概念。請再看個程序:
'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