重载和重写

    面向对象的三大特性:继承、封装、多态。重载和重写是多态的两种表现形式。

    重载和重写又有什么区别呢?

    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、如果两个同名函数仅返回值类型不同,那么他们不能重载,必须要在参数上有所不同

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值