重写是发生在父类与子类之间的关系@H_502_3@。具体来讲就是子类可以重写父类的现有的方法。它要求子类的方法名称及参数必须与父类完全一致@H_502_3@。比如吃饭,父亲可以吃两碗面,孩子同样也是吃面,却只能吃一碗。
重载则主要是发生在同一个类当中@H_502_3@的,它通过多个名称相同的方法,但方法参数不相同@H_502_3@,或者方法返回类型不相同来加以区别。其中,方法参数不相同包括以下几种情况:参数的个数不相同,参数的类型不相同,参数的对应位置不相同。需要说明的是,重载同样可以应用到父类与子类当中。即子类重载了父类的方法。
重写:
在 VB.NET 中,重写汲及到的关键字有:
OverRidable: 在父类中声明的可以在子类中重写的方法。
OverRides: 在子类中声明的要重写父亲中可重写的方法。
MustOverRide: 在父类中,表示这个方法必须在子类中重写。此时,该类必须声明为抽象类。
NotOverridable: 如果当前类还有子类,那么,在其子类中,该方法不允许被重写。
下面通过一个例子来认识它们的作用。
'本例中我们声明了三个类,分别代表三种对象:人,父亲,儿子。儿子继承自父亲,父亲又继承自人。@H_502_3@
'声明一个抽像类
@H_502_3@Public MustInherit Class People
'它包括一个抽象方法,这个方法必须要在其子类中被实现(重写)@H_502_3@
@H_502_3@ Public MustOverride Sub Eat(ByVal FoodName As String,ByVal num As Integer)
End Class@H_502_3@
'声明父亲类,继承自 Person 类@H_502_3@
Public Class Father : Inherits People
'重写 Person 的抽象方法,这是必须的。
@H_502_3@ Public Overrides Sub Eat(ByVal FoodName As String,ByVal num As Integer)
Console.WriteLine("父亲吃{0},他可以吃{1}碗!",FoodName,num)
End Sub@H_502_3@
'声明一个可被重写的函数,用 OverRidable 关键字@H_502_3@
Public Overridable Function GetMyName() As String
Return "父亲"
End Function@H_502_3@
'声明另外一个方法,用来说明子类中使用 NotOverRidable@H_502_3@
Public Overridable Sub ShowMyFatherClass()
Console.WriteLine("我的父类是 People")
End Sub
End Class@H_502_3@
'声明儿子类,继承自 Father@H_502_3@
Public Class Son : Inherits Father
'子类重写 Father 类的 Eat 方法,这里有两点要说明:
'1. Son 类作为 People 子类(Father)的子类,它不必一定要重写抽象方法。
' 换句话说,抽象类的抽象方法,只需要在其直接子类中强制实现,而不用
' 在它的除直接子类之外的其它子类(可看作是“孙类”)中实现。@H_502_3@@H_502_3@
'2. 在 Father 类中的 Eat 方法标记为 OverRides,它包括了两层含义:(1).它重写
' 了抽象父类中的抽象方法; (2). 这个方法可以在其子类中被隐式重写。因此,
' 它不包括 OverRidable 这个关键字,而其子类 Son 就可以对这个方法重写
@H_502_3@
Public Overrides Sub Eat(ByVal FoodName As String,ByVal num As Integer)
Console.WriteLine("孩子吃{0},他能吃{1}碗!",num)
End Sub@H_502_3@
'重写父类中被声明为 OverRidable 的方法,重写时用关键字 OverRides@H_502_3@
Public Overrides Function GetMyName() As String
@H_502_3@ '如果要使用父类的实现过程,则使用 MyBase 关键字
'Return MyBase.GetMyName()@H_502_3@
Return "孩子"
End Function@H_502_3@
'如果 Son 类还有子类,那么下面这个方法不可以在其子类中被重写,因为它被声明
'为 NotOverridable。这里有一点要注意:
'如果一个方法被声明为 NotOverRidable,那么它也同时必须被声明为 OverRides@H_502_3@
Public NotOverridable Overrides Sub ShowMyFatherClass()
Console.WriteLine("我的父类是 Father")
End Sub
End Class@H_502_3@
重载:
在 VB.NET 中,重载用到的关键是 OverLoads。请看如下代码:
Public Sub ShowMySelf(ByVal Name As String)
Public Sub ShowMySelf(ByVal Name As String,ByVal Age As Integer)
@H_502_3@
@H_502_3@ Public Sub ShowMySelf(ByVal Name As String,ByVal Age As Integer,ByVal Sex As String)@H_502_3@
@H_502_3@@H_502_3@ Public Overloads Function GetMyInfo() As String
Public Overloads Function GetMyInfo(ByVal MyID As Integer) As String
@H_502_3@
这里需要说明几点:
1. 对于在同一类当中,一组名称相同的方法或函数重载时,可以加关键字 OverLoads 或者不加。但如果其中有一个方法加上,那同组其它方法也必须加该关键字。
2. 如果该方法是重载父类中的方法。那么必须加 OverLoads 关键字。
3. 如果两个同名函数仅返回类型不相同,则它们不能重载,即必须在参数上有所不同。