请参考下面的代码:
Public Class Student
End Class
Public Class Undergraduate
Inherits Student
Public Sub Test(ByVal o As Object, ByVal s As Student)
o.Hello() 'Line 8
s.Hello() 'Line 9
End Sub
End Class第8行在运行时抛出一个异常,即缺少成员异常。第9行产生一个编译时错误,即Hello不是Student的成员。为什么第8行不抛出编译时异常。
发布于 2014-06-22 19:24:42
因为o在运行时可能是Student类型。每个类都可以强制转换为Object。
发布于 2014-06-22 20:54:16
Public Class Student
Public Overridable Sub Test()
Console.WriteLine("Hello, I am a student.")
End Sub
End Class
Public Class Undergraduate
Inherits Student
Public Overrides Sub Test()
MyBase.Test ' skip this if this class COMPLETELY
' replaces the base class functionality
Console.WriteLine("...and I am an undergrad.")
End Sub
End Class
Dim a As New Student
Dim b As New Undergraduate
a.Test
b.Test输出:
Hello, I am a student ' from a
Hello, I am a student ' from b's MyBase.Test
...and I am an undergrad. ' from b您的问题与后期绑定有关。通过传递o as Object,集成开发环境不能判断Hello方法在给定对象上是否可用。它可能是,也可能不是。如果您有Option Strict On,那么默认设置将不允许编译它,原因就在于此。如果您确信自己知道自己在做什么,则可以自定义错误以将Late Binding errors更改为warnings,甚至忽略它们。
重构后的代码可以更好地说明如何使用继承的类,以避免需要使用后期绑定,并且因为将对象传递给对象本身有点奇怪。
发布于 2014-06-22 21:04:03
我最后一次使用后期绑定是在C#中。我发现Visual Basic似乎是一个例外,如下所述:
只要变量的类型为Object并且编译器指令"Option Strict Off“生效,Visual Basic就会使用它们
来源维基百科:http://en.wikipedia.org/wiki/Late_binding#Late_binding_in_.NET
https://stackoverflow.com/questions/24350709
复制相似问题