hadows

overloads:与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同
overrides:将重写从基类继承的成员
shadows:隐藏基类中一个同名元素或一组重载元素
---------------------------------------------------------------

Public Overloads Sub a()
    Debug.Writeline("a()")
End Sub

Public Overloads Sub a(ByVal para1 As Integer)
    Debug.Writeline("a(ByVal para1 As Integer)")
End Sub

Public Sub Demo()
    a()
    a(1)
End Sub

此例说明Overloads的作用,就是允许同名函数的存在,前提是有不同的参数。其实这个Overloads是VB.NET beta 版遗留下来的关键字,现在已经可以不用写了,仍然存在是为了兼容已有的beta版代码。

现在写成:

Public Sub a()
...
End Sub

Public Sub a(ByVal para1 As Integer)
...
End Sub

也是可以的。
---------------------------------------------------------------

在.NET中实现多态有两种方式,覆盖(overrides)和投影(shadow)
,而投影又分为Shados by Name(就是我们一般用的shadows)和Shadows by
signature(参数序列),我们常用的overloads,可以不写的。


----------------------------------------------------------------

Public Class TheBase
    Public Overridable Sub a()
        Debug.Writeline("TheBase")
    End Sub
End Class

Public Class TheInherited
    Inherits TheBase
    Public Overrides Sub a()
        Debug.Writeline("TheInherited")
    End Sub
End Class

Public Class TheShadowed
    Inherits TheInherited
    Public Shadows Sub a()
        Debug.Writeline("TheShadowed")
    End Sub
End Class

'情况一:
Dim c As TheBase
c = New TheBase()
c.a()                 ' 输出 TheBase
c = New TheInherited()
c.a()                 ' 输出 TheInherited
c = New TheShadowed()
c.a()                 ' 输出 TheInherited

'情况二:
Dim c As TheInherited
c = New TheBase()
c.a()                 ' 错误!无效的转换。
c = New TheInherited()
c.a()                 ' 输出 TheInherited
c = New TheShadowed()
c.a()                 ' 输出 TheInherited

'情况三:
Dim c As TheShadowed
c = New TheBase()
c.a()                 ' 错误!无效的转换。
c = New TheInherited()
c.a()                 ' 错误!无效的转换。
c = New TheShadowed()
c.a()                 ' 输出 TheShadowed


此例说明Overridable、Overrides、Shadows的用法。
请注意TheBase里面的Overridable,如果没有这一句,后面类TheInherited将无法声明同名过程a(),而TheShadows仍然可以。
Overridable 的意思是:可以被重写的。
Overrides 的意思是:重写原来的。
Shadows 的意思是:这个函数/过程/变量跟我的父类没有任何关系,它是一个全新的过程。

在运行的例子中我们可以清晰地看到,无论变量c的定义是什么,VB.NET都会尽量寻找到最后被定义的那个成员。也就是说,如果被重写了,那么就找“从变量类型开始,到这个变量所指对象实际上的类为止,最后一次被重写(Overrides)的那个成员”。(当然,如果找不到,那么还会往变量类型的祖先那个方向上去找。)

简单点讲就是说,无论c怎么定以,如果他指向的是一个TheBase,他就找“到TheBase为止最后一次被重写的那个Sub a()”。如果他指向的是一个TheInherited,就找“到TheInherited为止最后一次被重写的那个Sub a()”,也就是TheInherited里面的那个。

对于TheShadowed来说,情况稍微复杂一点:
由于TheShadowed里面所写的那个a()被声明为Shadows的,也就是说这个a()跟TheBase和TheInherited里面的没有关系,于是从变量c的基类(TheBase)开始找,一直找到变量所指对象的类型TheShadowed,发现变量c的类型(无论是TheBase还是TheInherited)里面的那个a()最后一次被重写是在TheInherited里面(注意:TheShadows里面的a()跟它没关系),于是只要c不是Dim .. As TheShadows,那么就会选择调用TheInherited里面的a()了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值