学习VB.NET时,你可能会遇到VB.NET MyClass问题,这里将介绍VB.NET MyClass问题的解决方法,在这里拿出来和大家分享一下。VB.NET支持一项很有意思的功能——MyClass。大部分人使用VB.NET MyClass可能仅限于调用本类其他构造函数时。其实MyClass可以产生一些很独特的用法。MyClass永远按类的成员为不可重写的状态进行调用,即当类的方法被重写后,用MyClass仍能得到自身的版本。下面这个例子和VB帮助中所举的例子非常相似
- Public Class MyClassBase
- Protected Overridable Sub Greeting()
- Console.WriteLine("Hello form Base")
- End Sub
- Public Sub UseMe()
- Me.Greeting()
- End Sub
- Public Sub UseMyClass()
- MyClass.Greeting()
- End Sub
- End Class
- Public Class MyClassSub
- Inherits MyClassBase
- Protected Overrides Sub Greeting()
- Console.WriteLine("Hello form Sub")
- End Sub
- End Class
我们用一段代码来测试:
- Dim o As MyClassBase = New MyClassSub()
- o.UseMe()
- o.UseMyClass()
结果是UseMe执行了子类的版本,而UseMyClass还是执行了基类本身的版本,尽管这是一个虚拟方法。观其IL,可以看到其简单的实现原理:
Me用的调用指令是callvirt
- IL_0001: callvirt instance void App1.MyClassBase::Greeting()
而VB.NET MyClass调用的是call
- IL_0001: call instance void App1.MyClassBase::Greeting()
奇怪的是,如此简单的一个功能,我竟然无法用C#实现,C#怎样也不允许我按非虚函数的方式调用一个虚函数。C++可以用类名::方法名的方式访问自身版本的函数,但C#的类名只能用来访问静态的成员。这真是C#一个奇怪的限制。
【编辑推荐】