版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Microsoft Visual Basic 語(yǔ)言語(yǔ)義所需要的大量概念。其中很多概念是Visual Basic 程序員或C/C+ 程序員所熟悉的,但是這些概念的精確定義可能不同。Visual Basic 程序是由命名的實(shí)體構(gòu)成的。這些實(shí)體通過(guò)聲明引入,用來(lái)表示程序的“意思”。從較高層面來(lái)說(shuō),命名空間是用來(lái)組織其他實(shí)體的實(shí)體(如嵌套的命名空間和類(lèi)型。類(lèi)型是用于描述值和定義可執(zhí)行代碼的實(shí)體。類(lèi)型可以包含嵌套類(lèi)型和類(lèi)型成員。類(lèi)型成員包括常量、變量、方法、運(yùn)算符、屬性、事件、枚舉值和構(gòu)造函數(shù)。可包含其他實(shí)體的實(shí)體定義聲明空間。通過(guò)聲明或繼承將實(shí)體引入聲明空間;包含實(shí)體的聲明空間稱為實(shí)體的聲明上下文。在
2、聲明空間中聲明了一個(gè)實(shí)體,就等于定義了一個(gè)新聲明空間,該空間可以包含進(jìn)一步嵌套的實(shí)體聲明;由此,程序中的聲明將形成聲明空間的層次結(jié)構(gòu)。除重載的類(lèi)型成員之外,聲明將同一類(lèi)型的同名實(shí)體引入同一聲明上下文的做法是無(wú)效的。另外,聲明空間永遠(yuǎn)不能包含不同種類(lèi)的同名實(shí)體;例如,聲明空間永遠(yuǎn)不能包含名稱相同的變量和方法。 命名空間的聲明空間是“開(kāi)放式”的,因此兩個(gè)具有相同的完全限定名的命名空間聲明將構(gòu)成同一個(gè)聲明空間。在下面的示例中,兩個(gè)命名空間聲明提供相同的聲明空間,它們聲明了兩個(gè)類(lèi),完全限定名分別為Data.Customer和Data.Order:Namespace DataClass Customer
3、End ClassEnd NamespaceNamespace DataClass OrderEnd ClassEnd Namespace由于兩個(gè)聲明共同構(gòu)成同一個(gè)聲明空間,因此如果每個(gè)聲明中都包含一個(gè)同名類(lèi)的聲明,則將導(dǎo)致編譯時(shí)錯(cuò)誤。在聲明空間中聲明同一類(lèi)型的同名實(shí)體的唯一途徑是通過(guò)重載。只能重載方法、運(yùn)算符、實(shí)例構(gòu)造函數(shù)和屬性。重載的類(lèi)型成員必須具有唯一的簽名。類(lèi)型成員的簽名由類(lèi)型成員名稱、類(lèi)型參數(shù)數(shù)目以及成員參數(shù)的數(shù)目和類(lèi)型組成。轉(zhuǎn)換運(yùn)算符的簽名中還包含運(yùn)算符的返回類(lèi)型。以下實(shí)體不是成員簽名的組成部分,因此不能進(jìn)行重載:類(lèi)型成員的修飾符(如Shared或Private。參數(shù)的修飾符(如B
4、yVal或ByRef。參數(shù)名。方法或運(yùn)算符的返回類(lèi)型(除轉(zhuǎn)換運(yùn)算符之外或?qū)傩缘脑仡?lèi)型。類(lèi)型參數(shù)約束。下面的示例演示了一個(gè)重載方法聲明集及其簽名。因?yàn)橛腥舾蓚€(gè)方法聲明具有相同的簽名,所以此聲明無(wú)效。Interface ITestSub F1( ' Signature is F1(.Sub F2(x As Integer ' Signature is F2(Integer.Sub F3(ByRef x As Integer ' Signature is F3(Integer.Sub F4(x As Integer, y As Integer ' Signature
5、 isF4(Integer, Integer.Function F5(s As String As Integer ' Signature is F5(String.Function F6(x As Integer As Integer ' Signature is F6(Integer.Sub F7(a( As String ' Signature is F7(String(.Sub F8(ParamArray a( As String ' Signature isF8(String(.Sub F9(Of T( ' Signature is F9!1(
6、.Sub F10(Of T, U(x As T, y As U ' Signature is F10!2(!1, !2 Sub F11(Of U, T(x As T, y As U ' Signature is F11!2(!2, !1 Sub F12(Of T(x As T ' Signature is F12!1(!1Sub F13(Of T As IDisposable(x As T ' Signature is F13!1(!1 End Interface將包含可選參數(shù)的方法視為具有多個(gè)簽名,可通過(guò)調(diào)用方傳入的每組參數(shù)都有一個(gè)簽名。例如,以下方法有三個(gè)對(duì)
7、應(yīng)的簽名:Sub F(x As Short, _Optional y As Integer = 10, _Optional z As Long = 20以下是方法的簽名:F(ShortF(Short, IntegerF(Short, Integer, Long有效的做法是根據(jù)提供的類(lèi)型參數(shù),定義可以包含具有相同簽名的成員的一般類(lèi)型。重載解決方案規(guī)則用于嘗試消除這些重載之間的歧義,但有時(shí)候歧義是無(wú)法消除的。例如:Class C(Of TSub F(x As IntegerEnd SubSub F(x As TEnd SubSub G(Of U(x As T, y As UEnd SubSub G
8、(Of U(x As U, y As TEnd SubEnd ClassModule TestSub Main(Dim x As New C(Of Integerx.F(10 ' Calls C(Of T.F(Integerx.G(Of Integer(10, 10 ' Error: Can't choose between overloadsEnd SubEnd Module實(shí)體名的范圍是所有聲明空間的集合,在該范圍內(nèi)可以無(wú)限制引用該名稱。一般來(lái)說(shuō),實(shí)體名的范圍是其整個(gè)聲明上下文;但實(shí)體聲明也可能包含同名實(shí)體的嵌套聲明。此種情況下,嵌套實(shí)體會(huì)隱藏外部實(shí)體,只能通過(guò)限定
9、來(lái)訪問(wèn)被隱藏的實(shí)體。嵌套導(dǎo)致的隱藏會(huì)在如下情況產(chǎn)生:名稱空間中嵌套名稱空間或類(lèi)型時(shí);在類(lèi)型中嵌套其他類(lèi)型時(shí);在類(lèi)型成員體中。聲明嵌套導(dǎo)致的隱藏總是隱式發(fā)生,不需要明確的語(yǔ)法。在下面的示例中,在F方法中,局部變量i隱藏了實(shí)例變量i,但在G方法中,i仍引用實(shí)例變量。Class TestPrivate i As Integer = 0Sub F(Dim i As Integer = 1End SubSub G(i = 1End SubEnd Class當(dāng)內(nèi)部范圍中的名稱隱藏外部范圍中的名稱時(shí),它會(huì)隱藏該名稱的所有重載匹配項(xiàng)。在下面的示例中,因?yàn)閮?nèi)層聲明隱藏了F的所有外層匹配項(xiàng),所以調(diào)用F(1將調(diào)用在
10、Inner中聲明的F。同樣的原因,調(diào)用F("Hello"會(huì)出現(xiàn)錯(cuò)誤。Class OuterShared Sub F(i As IntegerEnd SubShared Sub F(s As StringEnd SubClass InnerShared Sub F(l As LongEnd SubSub G(F(1 ' Invokes Outer.Inner.F.F("Hello" ' Error.End SubEnd ClassEnd Class在繼承關(guān)系中,一種類(lèi)型(派生類(lèi)型是由其他類(lèi)型(基類(lèi)型派生的,因此,該派生類(lèi)型的聲明空間將隱式包
11、含可訪問(wèn)的非構(gòu)造函數(shù)類(lèi)型成員,以及該派生類(lèi)型的基類(lèi)型的嵌套類(lèi)型。在下面的示例中,類(lèi)A是B的基類(lèi),B派生自A。Class AEnd ClassClass BInherits AEnd Class因?yàn)锳未顯式指定基類(lèi),所以其基類(lèi)為隱式指定的Object。繼承的一些重要性質(zhì)為:繼承是可傳遞的。如果類(lèi)型C派生自類(lèi)型B,并且類(lèi)型B派生自類(lèi)型A,則類(lèi)型C將繼承類(lèi)型B以及類(lèi)型A所聲明的類(lèi)型成員。派生類(lèi)型只能擴(kuò)展(而無(wú)法縮小其基類(lèi)型的范圍。派生類(lèi)型可以添加新的類(lèi)型成員,并可以隱藏繼承的類(lèi)型成員,但它不能移除繼承的類(lèi)型成員的定義。因?yàn)槟愁?lèi)型的實(shí)例包含其基類(lèi)型的所有類(lèi)型成員,所以始終存在從派生類(lèi)型到基類(lèi)型的轉(zhuǎn)換。
12、除Object類(lèi)型外,所有類(lèi)型都必須有基類(lèi)型。因此,Object是所有類(lèi)型的最終基類(lèi)型,所有類(lèi)型都能轉(zhuǎn)換為該類(lèi)型。不允許循環(huán)派生。即如果類(lèi)型B派生自類(lèi)型A,則類(lèi)型A直接或間接派生自類(lèi)型B是錯(cuò)誤的。某個(gè)類(lèi)型不可以直接或間接派生自其嵌套類(lèi)型。由于存在類(lèi)間的循環(huán)依賴,下面的示例產(chǎn)生了編譯時(shí)錯(cuò)誤。Class AInherits BEnd ClassClass BInherits CEnd ClassClass CInherits AEnd Class由于B通過(guò)類(lèi) A 間接派生自其嵌套類(lèi)C,下面的示例也產(chǎn)生了編譯時(shí)錯(cuò)誤。Class AEnd ClassClass BInherits APublic Cl
13、ass CEnd ClassEnd Class因?yàn)锳未派生自類(lèi)B,所以下面的示例不會(huì)產(chǎn)生錯(cuò)誤。Class AClass BInherits AEnd ClassEnd Class1.3.1MustInherit 和NotInheritable 類(lèi)MustInherit類(lèi)是不完整的類(lèi)型,只能作為基類(lèi)型。MustInherit類(lèi)無(wú)法實(shí)例化,所以對(duì)其使用New運(yùn)算符也會(huì)產(chǎn)生錯(cuò)誤。可以聲明MustInherit類(lèi)的變量;對(duì)這些變量只能賦予Nothing,或賦予派生自相應(yīng)MustInherit類(lèi)的某個(gè)類(lèi)的值。如果某個(gè)常規(guī)類(lèi)派生自MustInherit類(lèi),該常規(guī)類(lèi)必須重寫(xiě)所有繼承的MustOverride
14、成員。例如:MustInherit Class APublic MustOverride Sub F(End ClassMustInherit Class BInherits APublic Sub G(End SubEnd ClassClass CInherits BPublic Overrides Sub F(End SubEnd ClassMustInherit類(lèi)A引入MustOverride方法F。類(lèi)B引入其他方法G,但不提供對(duì)F的實(shí)現(xiàn)。因此,類(lèi)B也必須聲明為MustInherit。類(lèi)C重寫(xiě)F并提供實(shí)際的實(shí)現(xiàn)。因?yàn)轭?lèi) C 中沒(méi)有未處理的 MustOverride成員,所以該類(lèi)不必是Mu
15、stInherit。NotInheritable類(lèi)不能派生其他類(lèi)。NotInheritable類(lèi)主要用于防止發(fā)生意外的派生。在下面的示例中,類(lèi)B嘗試從NotInheritable類(lèi)A派生,因此會(huì)產(chǎn)生錯(cuò)誤。類(lèi)不能同時(shí)聲明為MustInherit和NotInheritable。NotInheritable Class AEnd ClassClass B' Error, a class cannot derive from a NotInheritable class.Inherits AEnd Class其他類(lèi)型只派生自單一基類(lèi)型,而接口則可以派生自多個(gè)基接口。因此,接口可以從不同的基接口
16、繼承同名的類(lèi)型成員。在這種情況下,多重繼承的名稱在派生的接口中不可用,并且通過(guò)派生接口引用這些類(lèi)型成員中的任何一個(gè)都會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤(無(wú)論是簽名還是重載。必須轉(zhuǎn)而通過(guò)基接口名稱引用沖突的類(lèi)型成員。在下面的示例中,前兩個(gè)語(yǔ)句會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤,因?yàn)槎嘀乩^承成員Count在接口IListCounter中不可用:Interface IListProperty Count( As IntegerEnd InterfaceInterface ICounterSub Count(i As IntegerEnd InterfaceInterface IListCounterInherits IListInhe
17、rits ICounterEnd InterfaceModule TestSub F(x As IListCounterx.Count(1 ' Error, Count is not available.x.Count = 1 ' Error, Count is not available.CType(x, IList.Count = 1 ' Ok, invokes IList.Count.CType(x, ICounter.Count(1 ' Ok, invokes ICounter.Count.End SubEnd Module如上例所示,將x強(qiáng)制轉(zhuǎn)換為正確
18、的基接口類(lèi)型解決了多義性問(wèn)題。此類(lèi)強(qiáng)制轉(zhuǎn)換沒(méi)有運(yùn)行時(shí)開(kāi)銷(xiāo),它們只是在編譯時(shí)將該實(shí)例視為派生程度較小的類(lèi)型而已。當(dāng)單個(gè)類(lèi)型成員通過(guò)多個(gè)路徑繼承自同一基接口時(shí),會(huì)將該類(lèi)型成員視為只繼承過(guò)一次。換言之,派生的接口只包含繼承自特定基接口的每個(gè)類(lèi)型成員的一個(gè)實(shí)例。例如:Interface IBaseSub F(i As IntegerEnd InterfaceInterface ILeftInherits IBaseEnd InterfaceInterface IRightInherits IBaseEnd InterfaceInterface IDerivedInherits ILeft, IRigh
19、tEnd InterfaceClass DerivedImplements IDerived' Only have to implement F once.End SubEnd Class如果通過(guò)繼承層次結(jié)構(gòu)在一條路徑中隱藏了某個(gè)類(lèi)型成員名稱,則將在所有路徑中隱藏該名稱。在下面的示例中,IBase.F成員被ILeft.F成員隱藏,但未在IRight中隱藏:Interface IBaseSub F(i As IntegerEnd InterfaceInterface ILeftInherits IBaseShadows Sub F(i As IntegerEnd InterfaceInt
20、erface IRightInherits IBaseSub G(End InterfaceInterface IDerivedInherits ILeft, IRightEnd InterfaceClass TestSub H(d As IDerivedd.F(1 ' Invokes ILeft.F.CType(d, IBase.F(1 ' Invokes IBase.F.CType(d, ILeft.F(1 ' Invokes ILeft.F.CType(d, IRight.F(1 ' Invokes IBase.F.End SubEnd Class調(diào)用 d
21、.F(1時(shí)會(huì)選擇ILeft.F,即使IBase.F看起來(lái)并未在IRight中的訪問(wèn)路徑中隱藏。因?yàn)閺腎Derived到ILeft到IBase的訪問(wèn)路徑隱藏了IBase.F,所以從IDerived到IRight到IBase的訪問(wèn)路徑中也隱藏了該成員。派生類(lèi)型通過(guò)重新聲明繼承的類(lèi)型成員的名稱來(lái)隱藏該名稱。隱藏某個(gè)名稱的操作并不會(huì)移除具有該名稱的繼承的類(lèi)型成員;該操作只是使所有具有該名稱的繼承的類(lèi)型成員在派生類(lèi)中不可用。隱藏的聲明可以是任何類(lèi)型的實(shí)體。可重載的實(shí)體可以選擇兩種隱藏形式。使用Shadows關(guān)鍵字指定按名稱隱藏。按名稱隱藏的實(shí)體可以隱藏基類(lèi)中具有該名稱的任何項(xiàng),包括所有的重載。使用Ove
22、rloads關(guān)鍵字指定按名稱和簽名隱藏。按名稱和簽名隱藏的實(shí)體隱藏具有該名稱并與該實(shí)體具有相同簽名的任何項(xiàng)。例如:Class BaseSub F(End SubSub F(i As IntegerEnd SubSub G(End SubSub G(i As IntegerEnd SubEnd ClassClass DerivedInherits Base' Only hides F(Integer.Overloads Sub F(i As IntegerEnd Sub' Hides G( and G(Integer.Shadows Sub G(i As IntegerEnd S
23、ubEnd ClassModule TestSub Main(Dim x As New Derived(x.F( ' Calls Base.F(.x.G( ' Error: Missing parameter.End SubEnd Module按名稱和簽名隱藏帶ParamArray參數(shù)的方法時(shí),只隱藏單個(gè)簽名,而不是所有可能的擴(kuò)展簽名。即使隱藏方法的簽名與被隱藏方法的未擴(kuò)展簽名相匹配時(shí)也是如此。以下示例Class BaseSub F(ParamArray x( As IntegerConsole.WriteLine("Base"End SubEnd Clas
24、sClass DerivedInherits BaseOverloads Sub F(x( As IntegerConsole.WriteLine("Derived"End SubEnd ClassModule TestSub MainDim d As New Derived(d.F(10End SubEnd Module輸出Base(即使Derived.F與Base.F的非擴(kuò)展形式的簽名相同。相反,帶ParamArray參數(shù)的方法只隱藏與之具有相同簽名的方法,而不是所有具有可能的擴(kuò)展簽名的方法。以下示例Class BaseSub F(x As IntegerConsole
25、.WriteLine("Base"End SubEnd ClassClass DerivedInherits BaseOverloads Sub F(ParamArray x( As IntegerConsole.WriteLine("Derived"End SubEnd ClassModule TestSub Main(Dim d As New Derived(d.F(10End SubEnd Module輸出Base,(即使Derived.F的擴(kuò)展形式與Base.F具有相同的簽名。如果對(duì)未指定Shadows或Overloads的隱藏方法或?qū)傩月暶髁薕
26、verrides,則該隱藏方法或?qū)傩圆捎肙verloads,否則采用Shadows。如果重載實(shí)體集的一個(gè)成員指定了Shadows或Overloads關(guān)鍵字,則該實(shí)體集的所有成員都必須指定該關(guān)鍵字。不能同時(shí)指定Shadows和Overloads關(guān)鍵字。不能在標(biāo)準(zhǔn)模塊中指定Shadows 或Overloads;標(biāo)準(zhǔn)模塊中的成員隱式隱藏從Object繼承的成員。隱藏通過(guò)接口繼承進(jìn)行多重繼承(因此不可用的類(lèi)型成員的名稱是有效的,這樣使該名稱在派生接口中可用。例如:Interface ILeftSub F(End InterfaceInterface IRightSub F(End InterfaceI
27、nterface ILeftRightInherits ILeft, IRightShadows Sub F(End InterfaceModule TestSub G(i As ILeftRighti.F( ' Calls ILeftRight.F.CType(i, ILeft.F( ' Calls ILeft.F.CType(i, IRight.F( ' Calls IRight.F.End SubEnd Module因?yàn)榉椒梢噪[藏被繼承方法,所以,類(lèi)可以包含多個(gè)簽名相同的Overridable方法。這不會(huì)造成多義性問(wèn)題,因?yàn)橹挥信缮潭茸畲蟮哪莻€(gè)方法是可見(jiàn)的。在
28、下面的示例中,C類(lèi)和D類(lèi)包含兩個(gè)簽名相同的Overridable方法:Class APublic Overridable Sub F(Console.WriteLine("A.F"End SubEnd ClassClass BInherits APublic Overrides Sub F(Console.WriteLine("B.F"End SubClass CInherits BPublic Shadows Overridable Sub F(Console.WriteLine("C.F"End SubEnd ClassClass
29、 DInherits CPublic Overrides Sub F(Console.WriteLine("D.F"End SubEnd ClassModule TestSub Main(Dim d As New D(Dim a As A = dDim b As B = dDim c As C = da.F(b.F(c.F(d.F(End SubEnd Module示例中有兩個(gè)Overridable方法:一個(gè)由類(lèi)A引入,另一個(gè)由類(lèi)C引入。類(lèi)C引入的方法將隱藏從類(lèi)A繼承的方法。因此,類(lèi)D中的Overrides聲明會(huì)重寫(xiě)類(lèi)C引入的方法,類(lèi)D不可能重寫(xiě)類(lèi)A引入的方法。此例產(chǎn)生的輸
30、出如下:通過(guò)未隱藏Overridable方法的派生程度最小的類(lèi)型來(lái)訪問(wèn)類(lèi)D的實(shí)例,可以調(diào)用該被隱藏方法。隱藏MustOverride方法是無(wú)效的,因?yàn)榇蠖鄶?shù)情況下該操作會(huì)使類(lèi)不可用。例如:MustInherit Class BasePublic MustOverride Sub F(MustInherit Class DerivedInherits BasePublic Shadows Sub F(End SubEnd ClassClass MoreDerivedInherits Derived' Error: MustOverride method Base.F is not ove
31、rridden.End Class在本示例中,需要類(lèi)MoreDerived來(lái)重寫(xiě)MustOverride方法Base.F,但是因?yàn)轭?lèi)Derived隱藏了Base.F,所以該操作是不可行的。無(wú)法為Derived聲明有效的子代。與隱藏外部范圍中的名稱不同,隱藏繼承范圍中的可訪問(wèn)名稱會(huì)導(dǎo)致發(fā)出警告,如下面的示例所示:Class BasePublic Sub F(End SubPrivate Sub G(End SubEnd ClassClass DerivedInherits BasePublic Sub F( ' Warning: shadowing an inherited name.E
32、nd SubPublic Sub G( ' No warning, Base.G is not accessible here.End SubEnd Class在類(lèi)Derived中聲明方法F會(huì)導(dǎo)致警告。隱藏繼承的名稱不是一個(gè)錯(cuò)誤,因?yàn)檫@會(huì)限制基類(lèi)按自身情況進(jìn)行改進(jìn)。例如,由于更高版本的Base類(lèi)引入了該類(lèi)的早期版本中不存在的方法F,就可能發(fā)生上述情況。如果上述情況是一個(gè)錯(cuò)誤,當(dāng)基類(lèi)屬于一個(gè)單獨(dú)進(jìn)行版本控制的類(lèi)庫(kù)時(shí),對(duì)該基類(lèi)的任何更改都有可能導(dǎo)致它的派生類(lèi)變得無(wú)效。通過(guò)使用Shadows 或Overloads 修飾符可以消除因隱藏繼承的名稱導(dǎo)致的警告:Public Sub F(End S
33、ubEnd ClassClass DerivedInherits BasePublic Shadows Sub F( 'OK.End SubEnd ClassShadows修飾符指示要隱藏繼承的成員。如果沒(méi)有可隱藏的類(lèi)型成員名稱,指定Shadows或Overloads修飾符不會(huì)導(dǎo)致錯(cuò)誤。在聲明一個(gè)新成員時(shí),僅在該新成員的范圍內(nèi)隱藏繼承的成員,如下面的示例所示:Class BasePublic Shared Sub F(End SubEnd ClassClass DerivedInherits BasePrivate Shared Shadows Sub F( ' Shadows
34、 Base.F in class Derived only.End SubEnd ClassClass MoreDerivedInherits DerivedShared Sub G(F( ' Invokes Base.F.End SubEnd Class在上面的示例中,Derived 類(lèi)的方法F的聲明隱藏了繼承自Base類(lèi)的方法F,但因?yàn)镈erived 類(lèi)的新方法 F 具有Private訪問(wèn)類(lèi)型,所以其作用域不會(huì)擴(kuò)展到MoreDerived類(lèi)。因此,MoreDerived.G中調(diào)用F(是有效的并將調(diào)用Base.F。對(duì)于重載的類(lèi)型成員,將整個(gè)重載的類(lèi)型成員集視為所有成員都具有最高訪問(wèn)級(jí)
35、別,以便于進(jìn)行隱藏。Class BasePublic Sub F(End SubClass DerivedInherits BasePrivate Shadows Sub F(End SubPublic Shadows Sub F(i As IntegerEnd SubEnd ClassClass MoreDerivedInherits DerivedPublic Sub G(F( ' Error. No accessible member with this signature.End SubEnd Class在此示例中,即使在Derived中聲明F(時(shí)使用的是Private訪問(wèn)類(lèi)型
36、,聲明重載F(Integer時(shí)也使用Public訪問(wèn)類(lèi)型。因此,為便于進(jìn)行隱藏,將Derived 中的名稱F視為Public,因此兩種方法都隱藏Base中的F。當(dāng)某個(gè)類(lèi)型聲明其實(shí)現(xiàn)一個(gè)接口,并且該類(lèi)型實(shí)現(xiàn)該接口的所有類(lèi)型成員時(shí),會(huì)存在一個(gè)實(shí)現(xiàn)關(guān)系。實(shí)現(xiàn)某個(gè)特定接口的類(lèi)型可以轉(zhuǎn)換為該接口。無(wú)法實(shí)例化接口,但聲明接口變量是有效的;對(duì)這些變量所賦的值只能是實(shí)現(xiàn)該接口的類(lèi)的值。例如:Interface ITestableFunction Test(value As Byte As BooleanEnd InterfaceClass TestableClassImplements ITestableFu
37、nction Test(value As Byte As Boolean ImplementsReturn value > 128End FunctionEnd ClassModule TestSub F(Dim x As ITestable = New TestableClassDim b As Booleanb = x.Test(34End SubEnd Module即使某些方法不能從正在實(shí)現(xiàn)的派生接口直接訪問(wèn),實(shí)現(xiàn)接口(具有多重繼承的類(lèi)型成員的類(lèi)型也必須仍然實(shí)現(xiàn)這些方法。例如:Interface ILeftSub Test(End InterfaceInterface IRight
38、Sub Test(End InterfaceInterface ILeftRightInherits ILeft, IRightEnd InterfaceClass LeftRightImplements ILeftRight' Has to reference ILeft explicitly.End Sub' Has to reference IRight explicitly.End Sub' Error: Test is not available in ILeftRight.End SubEnd Class雖然MustInherit類(lèi)必須提供對(duì)實(shí)現(xiàn)的接口的所有
39、成員的實(shí)現(xiàn);但是,通過(guò)將方法聲明為MustOverride,這些類(lèi)可以延遲實(shí)現(xiàn)這些方法。例如:Interface ITestSub Test1(Sub Test2(End InterfaceMustInherit Class TestBaseImplements ITest' Provides an implementation.End Sub' Defers implementation.End ClassClass TestDerivedInherits TestBase' Have to implement MustOverride method.Override
40、s Sub Test2(End SubEnd Class某個(gè)類(lèi)型可以選擇重新實(shí)現(xiàn)其基類(lèi)型實(shí)現(xiàn)的接口。要重新實(shí)現(xiàn)該接口,該類(lèi)型必須顯式聲明實(shí)現(xiàn)該接口。重新實(shí)現(xiàn)接口的類(lèi)型可以選擇只重新實(shí)現(xiàn)部分(而不是全部接口成員任何未被重新實(shí)現(xiàn)的成員將繼續(xù)使用基類(lèi)型的實(shí)現(xiàn)。例如:Class TestBaseImplements ITestConsole.WriteLine("TestBase.Test1"End SubConsole.WriteLine("TestBase.Test2"End SubEnd ClassClass TestDerivedInherits Tes
41、tBaseImplements ITest ' Required to re-implementConsole.WriteLine("TestDerived.DerivedTest1"End SubEnd ClassModule TestSub Main(Dim Test As ITest = New TestDerived(Test.Test1(Test.Test2(End SubEnd Module此示例輸出:如果派生類(lèi)型實(shí)現(xiàn)的接口的基接口是通過(guò)該派生類(lèi)型的基類(lèi)型實(shí)現(xiàn)的,則派生類(lèi)型可以選擇僅實(shí)現(xiàn)該接口中尚未由基類(lèi)型實(shí)現(xiàn)的類(lèi)型成員。例如:Interface IBa
42、seSub Base(End InterfaceInterface IDerivedInherits IBaseSub Derived(End InterfaceClass BaseImplements IBaseEnd SubEnd ClassClass DerivedInherits BaseImplements IDerived' Required: IDerived.Derived not implemented by Base.End SubEnd Class在基類(lèi)型中使用可重寫(xiě)方法也可以實(shí)現(xiàn)接口方法。在這種情況下,派生類(lèi)型也可以重寫(xiě)可重寫(xiě)的方法,從而更改接口的實(shí)現(xiàn)。例如:C
43、lass BaseImplements ITestConsole.WriteLine("TestBase.Test1"End SubConsole.WriteLine("TestBase.Test2"End SubEnd ClassClass DerivedInherits Base' Overrides base implementation.Public Overrides Sub Test2(Console.WriteLine("TestDerived.Test2"End SubEnd Class通過(guò)為方法提供Imple
44、ments子句,類(lèi)型可以為已實(shí)現(xiàn)的接口實(shí)現(xiàn)類(lèi)型成員。兩個(gè)類(lèi)型成員必須具有相同數(shù)量的參數(shù),參數(shù)的所有類(lèi)型和修飾符也必須匹配(包括可選參數(shù)的默認(rèn)值,返回類(lèi)型必須匹配,方法參數(shù)的所有約束也必須匹配。例如:Interface ITestSub F(ByRef x As IntegerSub G(Optional y As Integer = 20Sub H(Paramarray z( As IntegerEnd InterfaceClass TestImplements ITest' Error: ByRef/ByVal mismatch.End Sub' Error: Default
45、s do not match.End Sub' Error: Paramarray does not match.End SubEnd Class如果類(lèi)型成員符合上述所有標(biāo)準(zhǔn),則單個(gè)方法可以實(shí)現(xiàn)任意數(shù)量的接口類(lèi)型成員。例如:Interface ITestSub F(i As IntegerSub G(i As IntegerEnd InterfaceClass TestImplements ITestEnd SubEnd Class實(shí)現(xiàn)常規(guī)接口的某個(gè)方法時(shí),實(shí)現(xiàn)的方法必須提供與該接口的類(lèi)型參數(shù)相對(duì)應(yīng)的類(lèi)型參數(shù)。例如:Interface I1(Of U, VSub M(x As U, y
46、 As List(Of VEnd InterfaceClass C1(Of W, XImplements I1(Of W, X' W corresponds to U and X corresponds to VPublic Sub M(x As W, y As List(Of X Implements I1(Of W, X.M End SubEnd ClassClass C2Implements I1(Of String, Integer' String corresponds to U and Integer corresponds to VPublic Sub M(x A
47、s String, y As List(Of Integer _End SubEnd Class請(qǐng)注意,對(duì)于某些類(lèi)型實(shí)參集來(lái)說(shuō),泛型接口可能是無(wú)法實(shí)現(xiàn)的。Interface I1(Of T, USub S1(x As TSub S1(y As UEnd InterfaceClass C1' Unable to implement because I1.S1 has two identical signatures Implements I1(Of Integer, IntegerEnd Class多態(tài)性可以使方法或?qū)傩缘膶?shí)現(xiàn)多樣化。使用多態(tài)性,相同的方法或?qū)傩钥梢詧?zhí)行不同的操作,具體取
48、決于調(diào)用該方法或?qū)傩缘膶?shí)例的運(yùn)行時(shí)類(lèi)型。方法或?qū)傩缘亩鄳B(tài)性稱為可重寫(xiě)性。相反,不可重寫(xiě)的方法或?qū)傩缘膶?shí)現(xiàn)是固定的;不論是針對(duì)在其中聲明方法或?qū)傩缘念?lèi)的實(shí)例調(diào)用方法或?qū)傩?還是針對(duì)派生類(lèi)的實(shí)例調(diào)用方法或?qū)傩?實(shí)現(xiàn)都是相同的。當(dāng)調(diào)用不可重寫(xiě)的方法或?qū)傩詴r(shí),實(shí)例的編譯時(shí)類(lèi)型是決定因素。例如:Class BasePublic Overridable Property X( As IntegerGetEnd GetSetEnd SetEnd PropertyEnd ClassClass DerivedInherits BasePublic Overrides Property X( As Integer
49、GetEnd GetSetEnd SetEnd PropertyEnd ClassModule TestSub F(Dim Z As BaseZ = New Base(Z = New Derived(End SubEnd Module可重寫(xiě)方法也可以是MustOverride,這意味著方法不提供方法體,必須將其重寫(xiě)。只有在MustInherit類(lèi)中才允許使用MustOverride。在下面的示例中,Shape類(lèi)定義了可以繪制自身的幾何形狀對(duì)象的抽象表示形式:MustInherit Public Class ShapePublic MustOverride Sub Paint(g As Grap
50、hics, r As RectangleEnd ClassPublic Class EllipseInherits ShapePublic Overrides Sub Paint(g As Graphics, r As Rectangleg.drawEllipse(rEnd SubEnd ClassPublic Class BoxInherits ShapePublic Overrides Sub Paint(g As Graphics, r As Rectangleg.drawRect(rEnd SubEnd ClassPaint方法是MustOverride,因?yàn)椴淮嬖谟幸饬x的默認(rèn)實(shí)現(xiàn)。E
51、llipse和Box類(lèi)是具體的Shape實(shí)現(xiàn)。因?yàn)檫@些類(lèi)不是MustInherit 類(lèi),所以它們需要重寫(xiě)Paint方法并提供實(shí)際的實(shí)現(xiàn)?;L問(wèn)引用MustOverride方法是錯(cuò)誤的,如下例所示:MustInherit Class APublic MustOverride Sub F(End ClassClass BInherits APublic Overrides Sub F(MyBase.F( ' Error, MyBase.F is MustOverride.End SubEnd ClassMyBase.F(調(diào)用出錯(cuò),因?yàn)樗肕ustOverride方法。通過(guò)聲明具有相同名稱
52、和簽名的方法并用Overrides修飾符標(biāo)記聲明,類(lèi)型可重寫(xiě)繼承的可重寫(xiě)方法。下面列出了對(duì)重寫(xiě)方法的附加要求。Overridable方法聲明用于引入新方法,而Overrides方法聲明用于替換繼承的方法實(shí)現(xiàn)。重寫(xiě)方法可以聲明為NotOverridable,這樣可防止在派生類(lèi)型中對(duì)該方法進(jìn)行進(jìn)一步重寫(xiě)。實(shí)際上,NotOverridable方法在任何進(jìn)一步派生的類(lèi)中都變?yōu)椴豢芍貙?xiě)。請(qǐng)看下面的示例:Class APublic Overridable Sub F(Console.WriteLine("A.F"End SubPublic Overridable Sub G(Conso
53、le.WriteLine("A.G"End SubEnd ClassClass BInherits APublic Overrides NotOverridable Sub F(Console.WriteLine("B.F"End SubPublic Overrides Sub G(Console.WriteLine("B.G"End SubEnd ClassClass CInherits BPublic Overrides Sub G(Console.WriteLine("C.G"End SubEnd Class
54、在此示例中,類(lèi)B提供兩個(gè)Overrides方法:具有NotOverridable修飾符的方法F以及沒(méi)有該修飾符的方法G。使用NotOverridable修飾符可防止類(lèi)C進(jìn)一步重寫(xiě)方法F。重寫(xiě)方法也可以聲明為MustOverride,即使該方法要重寫(xiě)的方法未聲明為MustOverride也是如此。這需要包含類(lèi)聲明為MustInherit,并且未聲明為MustInherit的所有進(jìn)一步派生的類(lèi)都必須重寫(xiě)該方法。例如:Class APublic Overridable Sub F(Console.WriteLine("A.F"End SubEnd ClassMustInherit
55、 Class BInherits APublic Overrides MustOverride Sub F(End Class在此示例中,類(lèi)B使用MustOverride 方法重寫(xiě) A.F。這意味著派生自B的所有類(lèi)都必須重寫(xiě)F,除非這些類(lèi)也聲明為MustInherit。除非下列所有項(xiàng)對(duì)于一個(gè)重寫(xiě)方法皆為真,否則將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤:1.聲明上下文包含一個(gè)單個(gè)可訪問(wèn)的繼承方法,該方法具有與重寫(xiě)方法相同的簽名和返回類(lèi)型(如果存在。2.正在被重寫(xiě)的繼承的方法是可重寫(xiě)的。換言之,要重寫(xiě)的繼承方法不是Shared或NotOverridable。3.聲明的方法的可訪問(wèn)域與被重寫(xiě)的繼承方法的可訪問(wèn)域相同。有一
56、種例外情況:如果要重寫(xiě)的方法在另一個(gè)程序集中,而重寫(xiě)方法對(duì)該程序集沒(méi)有Friend訪問(wèn)權(quán)限,則必須由Protected方法重寫(xiě)Protected Friend方法。4.重寫(xiě)方法的形參與被重寫(xiě)方法的形參在ByVal、ByRef、ParamArray和Optional修飾符的使用上是一致的,包括為可選形參提供的值也是相同的。5.重寫(xiě)方法的類(lèi)型參數(shù)與被重寫(xiě)方法的類(lèi)型參數(shù)在類(lèi)型約束方面必須相匹配。重寫(xiě)基泛型類(lèi)型中的方法時(shí),重寫(xiě)方法必須提供與基類(lèi)型形參對(duì)應(yīng)的類(lèi)型實(shí)參。例如:Class Base(Of U, VPublic Overridable Sub M(x As U, y As List(Of VEnd SubEnd ClassClass Derived(Of W, XInherits Base(Of W, X' W corresponds to U and X corresponds to VPublic Overrides Sub M(x As W, y As List(Of XEnd SubEnd ClassClass MoreDerivedInherits Derived(Of String, Integer' String
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:近代日本對(duì)中國(guó)茶業(yè)的侵奪研究
- 課題申報(bào)參考:教育高質(zhì)量發(fā)展視域下大學(xué)體育一流本科課程建設(shè)實(shí)證研究
- 2025年園林景觀綠化地使用權(quán)轉(zhuǎn)讓合同4篇
- 2025年度新能源汽車(chē)充電站車(chē)位租賃合作協(xié)議書(shū)4篇
- 2025版委托擔(dān)保合同范本:知識(shí)產(chǎn)權(quán)質(zhì)押貸款擔(dān)保合同3篇
- 2025年度家具行業(yè)綠色供應(yīng)鏈管理合同4篇
- 二零二五版橋梁建設(shè)施工合作協(xié)議2篇
- 2025年度個(gè)人沿街店房租賃合同(含合同解除條件與爭(zhēng)議解決)4篇
- 二零二五年度國(guó)際交流項(xiàng)目教師選拔與聘用協(xié)議
- 2025年度星級(jí)酒店廚房設(shè)備采購(gòu)與定期檢修合同4篇
- 數(shù)學(xué)-山東省2025年1月濟(jì)南市高三期末學(xué)習(xí)質(zhì)量檢測(cè)濟(jì)南期末試題和答案
- 中儲(chǔ)糧黑龍江分公司社招2025年學(xué)習(xí)資料
- 湖南省長(zhǎng)沙市2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期期末考試試卷
- 船舶行業(yè)維修保養(yǎng)合同
- 2024年林地使用權(quán)轉(zhuǎn)讓協(xié)議書(shū)
- 物流有限公司安全生產(chǎn)專(zhuān)項(xiàng)整治三年行動(dòng)實(shí)施方案全國(guó)安全生產(chǎn)專(zhuān)項(xiàng)整治三年行動(dòng)計(jì)劃
- 基于ADAMS的汽車(chē)懸架系統(tǒng)建模與優(yōu)化
- 當(dāng)前中國(guó)個(gè)人極端暴力犯罪個(gè)案研究
- 中國(guó)象棋比賽規(guī)則
- 7天減肥餐食譜給你最能瘦的一周減肥食譜
- GB/T 31525-2015圖形標(biāo)志電動(dòng)汽車(chē)充換電設(shè)施標(biāo)志
評(píng)論
0/150
提交評(píng)論