面向对象的三大特性:继承、封装、多态。重载和重写是多态的两种表现形式。
重载和重写又有什么区别呢?
1、层次不同:
重写 : 发生在父类和子类之间。
是子类重写父类的方法,具有相同的方法名和方法参数。比如说,父子两人都去吃饭(相同的方法),吃的是面条(参数),父亲饭量大,吃两碗,儿子饭量小,就能吃一碗(实现了吃饭的多态)。
重载: 发生在同一个类当中。
同一个类当中相同的方法名,不同的参数,而且必须是不同的参数或者不同的方法返回值(如果两个函数仅返回值不同,那么它不能重载,必须要有参数不同才可以)。这里的方法参数不同包括:参数个数、类型、对应位置不同,至少要有三种情况中的任何一种不同才可。举个例子:父亲跟其他的同事在同一个工地打工(同一个类),中午下工后大家都去吃饭(相同的方法名),但是有的人喜欢吃面条、有的人喜欢吃油条(参数类型不同),同样吃面条,有的人吃两碗,有的人吃一碗(参数个数不同),监工吃完饭后跟老板去KTV了,而苦命的打工仔,吃晚饭还要去工地继续搬砖(不同的返回值),当然了老板不会每天叫你去KTV,吃完饭后大家都去休息,也可以是相同的返回值,只是不同的人吃下去的饭是有差别的(吃的数量、吃的东西)。
2、代码中的不同
重写:
MustInherit关键字声明一个抽象类
抽象类中MustOverride关键字声明一个必须重写的方法
子类中Overrides 关键字的两层含义:
指明某方法重写了父类的方法
这个方法可以在它的子类中被隐式重写
子类中Overridable关键字声明可以被重写的函数
NotOverridable 指明该方法不可被重写
下面看一下,给网上找的一段相关代码:
'MustInherit关键字声明一个抽象类
Public MustInherit Class People
'MustOverride关键字声明一个必须重写的吃饭方法
Public MustOverride Sub Eat(ByVal foodName As String, ByVal num As Integer)
End Class
'声明一个父亲类,继承自People类
Public Class Father : Inherits People
'这里必须要重写People类的吃饭方法,Overrides关键字会自动生成。
'Overrides 关键字的两层含义:
'1、它重写了抽象父类People的Eat(抽象)方法
'2、这个方法可以在它的子类中被隐式重写,因此它不包含overridable关键字
Public Overrides Sub Eat(ByVal foodName As String, ByVal num As Integer)
Console.WriteLine("父亲吃{0},他可以吃{1}碗!", foodName, num)
End Sub
' Overridable关键字声明一个可以被重写的函数
Public Overridable Function GetByName() As String
Return "父亲"
End Function
'声明另外一个方法,用来说明子类中使用NotOverridable
Public Overridable Sub ShowMyFatherClass()
Console.WriteLine("我的父类是People")
End Sub
End Class
Public Class Son : Inherits Father
'因为Father类中没有用mustoverride 关键字生命的方法,所以,继承的子类不会自动添加父类中的方法
'要想重写父类中的方法,这里就需要手动实现。
'子类重写父类的Eat方法
'做两点说明:
'抽象类的抽象方法只需要在其直接子类中强制实现,不用在其他子类中(包括孙类)中实现
Public Overrides Sub Eat(ByVal foodName As String, ByVal num As Integer)
Console.WriteLine("孩子吃{0},他能吃{1}碗", foodName, num)
End Sub
'重写父类Father中定义的GetByName方法
Public Overrides Function GetByName() As String
'如果要实现父类的实现过程,则使用MyBase关键字
'Return MyBase.GetByName()
Return "孩子"
End Function
'重写Father类中的ShowMyFatherClass方法(Overrides关键字指明),但是如果Son类,还有子类的话,子类不可以重写该方法(NotOverridable关键字说明)。
Public NotOverridable Overrides Sub ShowMyFatherClass()
MyBase.ShowMyFatherClass()
End Sub
End Class
重载:
重载的代码规定相对比较容易,做几点说明:
1、同一个类中,如果一组同名的方法、函数可加关键字Overloads 也可不加,但是这一组的函数、方法格式应该保持一致
2、如果该方法是重载父类中的方法,那么必须加上关键字Overloads
3、如果两个同名函数仅返回值类型不同,那么他们不能重载,必须要在参数上有所不同