那位高手能详细的讲解一下VB.NET中的overloads,overrides,shadows的异同点,最好能给出例子!

li_new 2003-02-21 02:14:13
加精
那位高手能详细的讲解一下VB.NET中的overloads,overrides,shadows的异同点,最好能给出例子!
同时请讲解一下com,com+,dcom!
谢谢了!
...全文
149 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sumtec 2003-02-22
  • 打赏
  • 举报
回复
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()了。

不知道看明白了没有?
Montaque 2003-02-22
  • 打赏
  • 举报
回复
在.NET中实现多态有两种方式,覆盖(overrides)和投影(shadow)
,而投影又分为Shados by Name(就是我们一般用的shadows)和Shadows by
signature(参数序列),我们常用的overloads,可以不写的。
sumtec 2003-02-22
  • 打赏
  • 举报
回复
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

也是可以的。
li_new 2003-02-22
  • 打赏
  • 举报
回复
能不能给出具体的实例呀!
huxin1012 2003-02-21
  • 打赏
  • 举报
回复
overloads:与现有成员相同的名称来声明属性或方法,但参数列表与原始成员不同
overrides:将重写从基类继承的成员
shadows:隐藏基类中一个同名元素或一组重载元素
VB.Net常用语法 一:Try………Catch………finally………end try 捕获错误 把一个可能出错的语句放在try后面,如果出错,执行catch语句, catch可以有多个,第一个catch不能捕获的错误,将被下一个catch语句 所捕获。在所有的处理结束后,执行finally语句。 在一个try………end try 过程可以使用catch与finally两个的一 个,或者两个一起用, 二:Protected, private, Public 封装控制 这三个关键字一般放在语句最前面,而会置于overloads与Overrides的 后面 public是工程级别外部访问 protected是本族级别以下内部访问 private是不提供非本地访问 三:ByVal sender As Object, ByVal e As System.EventArgs   这是最赏用事件传递参数。被封装于两个对象内, 如果你要传递相应的参数,要在这两个对象里面找,如当前鼠标位置为 e.X e.Y。在VB.Net有些事件是要自已动手写的, 如窗体鼠标过程,一般加上这个参数在后面的括号内就解决了。 四:重载语法Overloads 如:class class1 public strtem as string overloads public sub subx()重载subx(A状态) strtem=”3” end sub overloads public sub subx(x as string) 重载subx(B状 态) strtem=x end sub end class 如果你如果调用subx()间没有参数,则VB自动调用重载subx(A状 态), overloads public sub subx()重载subx(A状态) strtem=”3” end sub 结果就是strtem=”3” 如果你这样调用,subx(“这是一个不同的结果”),则VB自动调用重 载subx(B状态) overloads public sub subx(x as string) 重载subx(B状 态) strtem=x end sub 结果就是 strtem=“这是一个不同的结果” 您可以在函数调用,包括在API(当然VB.Net不再使用winAPI). 甚至一些至关紧要的过程也不例外:如new过程(此方法王国荣文章 有介绍) 如: class class1 Overloads Public Sub New() 。。。。。。 。。。。。。 end sub Overloads Public Sub New(s as string) 。。。。。。 。。。。。。 end sub end class 同样有两种调用的方法,如dim as as class1=new class 调用前面 一个无参数的new过程, 而dim asb as class1=new class(“string”)调用第二个new 过程. 切记,如果一个过程或一个函数只有一种状态,不能这样运用。如果您试 图使用overloads关键字,则VB.Net会出现错误的提示要求你移去 overloads 五:Overrides改写 如常见的dispose过程: Overrides Public Sub Dispose() MyBase.Dispose components.Dispose End Sub Overrides表示完全的改写父类提供的过程与函数 不过要记住使用改写的前提是在父类的同一过程或函数的前面也使用了 overrides关键字 六:mybase.new 与mybase.dispose ublic Sub New() MyBase.New Form1 = Me InitializeComponent End Sub Overrides Public Sub Dispose() ' MyBase.Dispose components.Dispose End Sub 这两个过程是任何一个新建工程都会有的,mybase.new是调用当前类的 父类的new过程,同样你也可以加上参数配合父类的重载New过程。如: Overloads Public Sub New () MyBase.New() End Sub Overloads Public Sub New (string) MyBase.New(string) End Sub 七:Structure构造 自定义类型,如: Structure Type1 Dim x as y Dim a as b 。。。。。。。 end structure 这个取代VB6的使用type………end type方式自定义类型的方法。 八:return返回值 function functionname() return X。。。。。。 end funtion 他的作用与下面一样: function functionname() functionname = X。。。。。。 end funtion

16,720

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧