• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        VB.NET是怎樣做到的(5、6)

        VB.NET是怎樣做到的(5、6)

        更新時間:2022-05-02 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):



        VB.net是怎樣做到的(五)——實現(xiàn)接口

        VB.net采用的實現(xiàn)接口的語法是VB5發(fā)明的Implements,這個實現(xiàn)接口的語法在當(dāng)今主流語言中獨一無二。比如我有兩個接口:

        Interface Interface1
        Sub Test()
        End Interface

        Interface Interface2
        Sub Test()
        End Interface

        這兩個接口有一個完全一樣的成員Test。假設(shè)我需要用一個類同時實現(xiàn)兩個接口會怎么樣呢?先想想看,如果是Java,JScrip.NET這樣的語言就只能用一個Test函數(shù)實現(xiàn)兩個接口的Test成員。假如兩個Test只是偶然重名,其內(nèi)容必須要分別實現(xiàn)怎么辦,于是一些解決接口重名的設(shè)計出現(xiàn)了……。在VB中,獨特的Implements語句可以讓你想怎么實現(xiàn)接口就怎么實現(xiàn),比如下面的類Implementation用兩個名字根本不一樣的方法實現(xiàn)了兩個接口。

        Public Class Implementation
        Implements Interface1, Interface2

        Public Sub Hello() Implements Interface1.Test

        End Sub

        Private Sub Hi() Implements Interface2.Test

        End Sub
        End Class

        也就是說,VB允許用任意名字的函數(shù)實現(xiàn)接口中的成員,而且訪問器可以是任意的,比如想用Public還是Private都可以。

        C#在處理重名成員上提供了顯式實現(xiàn)(explicit implementation)的語法,其實現(xiàn)上述兩個接口的語法為

        public class Class1 : Interface1, Interface2
        {
        public Class1()
        {
        }
        void Interface1.Test()
        {
        }

        void Interface2.Test()
        {
        }

        }

        注意這里,C#只能用接口名.成員名的名字來命名實現(xiàn)方法,而且訪問器只能是private,不能公開顯式實現(xiàn)的方法。

        在考察了IL以后,我發(fā)現(xiàn).NET支持隱式實現(xiàn)和顯式實現(xiàn)兩種方式。其中隱式實現(xiàn)只要在類里面放一個與接口成員方法名字一樣的方法即可——這一種VB不支持。而顯式實現(xiàn)則在方法的描述信息里加入:

        .override TestApp.Interface1::Test

        無論是C#的顯式實現(xiàn)還是VB的Implements語句都是這樣的原理。也就是說.NET提供了換名實現(xiàn)接口成員的功能,但是只有VB將這個自由讓給了用戶,而其他語言還是采用了經(jīng)典的語法。


        VB.NET是怎樣做到的(六)——默認(rèn)屬性和屬性參數(shù)


        在原先的VB6里,有一項奇特的功能——默認(rèn)屬性。在VB6中,對象的名稱可以直接表示該對象的默認(rèn)屬性。比如TextBox的默認(rèn)屬性是Text,所以下面的代碼

        Text1.Text = "Hello"

        就可以簡化為

        Text1 = "Hello"

        這種簡化給VB帶來了很多麻煩,賦值運算就需要兩個關(guān)鍵字——Let和Set,結(jié)果屬性過程也需要Let和Set兩種。而且這種特征在后期綁定的時候仍能工作。到了VB.NET,這項功能被大大限制了,現(xiàn)在只有帶參數(shù)的屬性才可以作為默認(rèn)屬性。如

        List1.Item(0) = "Hello"

        可以簡化為

        List1(0) = "Hello"

        這種語法讓有默認(rèn)屬性的對象看起來像是一個數(shù)組。那么VB怎么判斷一個屬性是否是默認(rèn)屬性呢?看下列代碼

        Public Class PropTest

        Public Property P1(ByVal index As Integer) As String

        Get


        End Get

        Set(ByVal Value As String)


        End Set

        End Property


        Default Public Property P2(ByVal index As Integer) As String

        Get


        End Get

        Set(ByVal Value As String)


        End Set

        End Property

        End Class

        P1和P2兩個屬性基本上完全相同,唯一的不同是P2帶有一個Default修飾符。反匯編這個類以后,可以發(fā)現(xiàn)兩個屬性完全相同,沒有任何差異。但是PropTest類卻被增加了一個自定義元屬性System.Reflection.DefaultMemberAttribute。這個元屬性指定的成員是InvokeMember所使用默認(rèn)類型,也就是說后期綁定也可以使用默認(rèn)屬性。可是我試驗將DefaultMember元屬性手工添加到類型上卻不能達到讓某屬性成為默認(rèn)屬性的功能。看來這項功能又是VB的一項“語法甜頭”。但是,VB或C#的編譯器對別人生成的類的默認(rèn)屬性應(yīng)該只能通過DefaultMemberAttribute來判斷,所以我將一個VB類只用DefaultMemberAttribute指定一個默認(rèn)方法,不使用Default,然后將它編譯以后給C#用,果然,C#將它識別為一個索引器(indexer)!

        既然說到了C#的索引器,我們就順便來研究一下VB和C#屬性方面的不同。剛才的實驗結(jié)果是VB的默認(rèn)屬性在C#中就是索引器。但是VB仍然可以用屬性的語法來訪問默認(rèn)屬性,而C#只能用數(shù)組的語法訪問索引器。更特別的是,VB可以創(chuàng)建不是默認(rèn)屬性,但是帶有參數(shù)的屬性,如上面例子里的P1,而C#則不支持帶參數(shù)的屬性,如果將VB編寫的,含有帶參數(shù)屬性的類給C#用,C#會提示“屬性不受該語言支持,請用get_XXX和set_XXX的語法訪問”。也就是說,帶參數(shù)的屬性是CLR的一項功能,但不符合CLS(通用語言規(guī)范),因此就會出現(xiàn)跨語言的障礙。這也更加深了我們對CLS的認(rèn)識——如果你希望讓你的代碼跨語言工作,請一定要注意符合CLS。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲综合国产精品第一页| 国产免费牲交视频| 亚洲永久永久永久永久永久精品| a级毛片免费网站| 中文字幕精品亚洲无线码一区| 特级aa**毛片免费观看| 亚洲黄片毛片在线观看| jizz免费在线观看| 亚洲人成网77777亚洲色| 无码国产精品一区二区免费模式 | 久久精品国产亚洲AV久| 日韩吃奶摸下AA片免费观看| 最新亚洲卡一卡二卡三新区| 免费看的黄色大片| 日日狠狠久久偷偷色综合免费| 亚洲熟女乱综合一区二区| 中文字幕日本人妻久久久免费| 亚洲a在线视频视频| 成年女人免费碰碰视频| 亚洲AV无码一区二区乱子仑| 亚洲乱码国产一区网址| 免费国产午夜高清在线视频 | 国产精品免费看久久久久| 思思久久99热免费精品6| 亚洲日本va中文字幕久久| 久久精品免费一区二区| 亚洲国产精品99久久久久久| 亚洲精品专区在线观看| 亚洲免费在线播放| 亚洲国产精品成人午夜在线观看| 亚洲一级Av无码毛片久久精品| 99xxoo视频在线永久免费观看| 亚洲综合在线一区二区三区 | j8又粗又长又硬又爽免费视频| 久久精品国产亚洲香蕉| 午夜a级成人免费毛片| 国产又黄又爽又大的免费视频 | 亚洲欧洲日产国码久在线观看| 成人免费毛片视频| 国产午夜不卡AV免费| 国产精品亚洲精品观看不卡|