詳細(xì)介紹VB.NET MyClass
學(xué)習(xí)VB.NET時,你可能會遇到VB.NET MyClass問題,這里將介紹VB.NET MyClass問題的解決方法,在這里拿出來和大家分享一下。VB.NET支持一項很有意思的功能——MyClass。大部分人使用VB.NET MyClass可能僅限于調(diào)用本類其他構(gòu)造函數(shù)時。其實MyClass可以產(chǎn)生一些很獨特的用法。MyClass永遠(yuǎn)按類的成員為不可重寫的狀態(tài)進(jìn)行調(diào)用,即當(dāng)類的方法被重寫后,用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()
結(jié)果是UseMe執(zhí)行了子類的版本,而UseMyClass還是執(zhí)行了基類本身的版本,盡管這是一個虛擬方法。觀其IL,可以看到其簡單的實現(xiàn)原理:
Me用的調(diào)用指令是callvirt
- IL_0001: callvirt instance void App1.MyClassBase::Greeting()
而VB.NET MyClass調(diào)用的是call
- IL_0001: call instance void App1.MyClassBase::Greeting()
奇怪的是,如此簡單的一個功能,我竟然無法用C#實現(xiàn),C#怎樣也不允許我按非虛函數(shù)的方式調(diào)用一個虛函數(shù)。C++可以用類名::方法名的方式訪問自身版本的函數(shù),但C#的類名只能用來訪問靜態(tài)的成員。這真是C#一個奇怪的限制。
【編輯推薦】