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