加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

hadows

发布时间:2020-12-16 23:11:37 所属栏目:大数据 来源:网络整理
导读:overloads:与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同 overrides:将重写从基类继承的成员 shadows:隐藏基类中一个同名元素或一组重载元素 --------------------------------------------------------------- PublicOverloadsSuba() De

overloads:与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同 overrides:将重写从基类继承的成员 shadows:隐藏基类中一个同名元素或一组重载元素 --------------------------------------------------------------- PublicOverloadsSuba() Debug.Writeline("a()") EndSub PublicOverloadsSuba(ByValpara1AsInteger) Debug.Writeline("a(ByValpara1AsInteger)") EndSub PublicSubDemo() a() a(1) EndSub 此例说明Overloads的作用,就是允许同名函数的存在,前提是有不同的参数。其实这个Overloads是VB.NETbeta版遗留下来的关键字,现在已经可以不用写了,仍然存在是为了兼容已有的beta版代码。 现在写成: PublicSuba() ... EndSub PublicSuba(ByValpara1AsInteger) ... EndSub 也是可以的。 --------------------------------------------------------------- 在.NET中实现多态有两种方式,覆盖(overrides)和投影(shadow),而投影又分为ShadosbyName(就是我们一般用的shadows)和Shadowsby signature(参数序列),我们常用的overloads,可以不写的。 ---------------------------------------------------------------- PublicClassTheBase PublicOverridableSuba() Debug.Writeline("TheBase") EndSub EndClass PublicClassTheInherited InheritsTheBase PublicOverridesSuba() Debug.Writeline("TheInherited") EndSub EndClass PublicClassTheShadowed InheritsTheInherited PublicShadowsSuba() Debug.Writeline("TheShadowed") EndSub EndClass '情况一: DimcAsTheBase c=NewTheBase() c.a()'输出TheBase c=NewTheInherited() c.a()'输出TheInherited c=NewTheShadowed() c.a()'输出TheInherited '情况二: DimcAsTheInherited c=NewTheBase() c.a()'错误!无效的转换。 c=NewTheInherited() c.a()'输出TheInherited c=NewTheShadowed() c.a()'输出TheInherited '情况三: DimcAsTheShadowed c=NewTheBase() c.a()'错误!无效的转换。 c=NewTheInherited() c.a()'错误!无效的转换。 c=NewTheShadowed() c.a()'输出TheShadowed 此例说明Overridable、Overrides、Shadows的用法。 请注意TheBase里面的Overridable,如果没有这一句,后面类TheInherited将无法声明同名过程a(),而TheShadows仍然可以。 Overridable的意思是:可以被重写的。 Overrides的意思是:重写原来的。 Shadows的意思是:这个函数/过程/变量跟我的父类没有任何关系,它是一个全新的过程。 在运行的例子中我们可以清晰地看到,无论变量c的定义是什么,VB.NET都会尽量寻找到最后被定义的那个成员。也就是说,如果被重写了,那么就找“从变量类型开始,到这个变量所指对象实际上的类为止,最后一次被重写(Overrides)的那个成员”。(当然,如果找不到,那么还会往变量类型的祖先那个方向上去找。) 简单点讲就是说,无论c怎么定以,如果他指向的是一个TheBase,他就找“到TheBase为止最后一次被重写的那个Suba()”。如果他指向的是一个TheInherited,就找“到TheInherited为止最后一次被重写的那个Suba()”,也就是TheInherited里面的那个。 对于TheShadowed来说,情况稍微复杂一点: 由于TheShadowed里面所写的那个a()被声明为Shadows的,也就是说这个a()跟TheBase和TheInherited里面的没有关系,于是从变量c的基类(TheBase)开始找,一直找到变量所指对象的类型TheShadowed,发现变量c的类型(无论是TheBase还是TheInherited)里面的那个a()最后一次被重写是在TheInherited里面(注意:TheShadows里面的a()跟它没关系),于是只要c不是Dim..AsTheShadows,那么就会选择调用TheInherited里面的a()了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读