Visual Basic4. 各種概念及詳細(xì)代碼說明_第1頁
Visual Basic4. 各種概念及詳細(xì)代碼說明_第2頁
Visual Basic4. 各種概念及詳細(xì)代碼說明_第3頁
Visual Basic4. 各種概念及詳細(xì)代碼說明_第4頁
Visual Basic4. 各種概念及詳細(xì)代碼說明_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Microsoft Visual Basic 語言語義所需要的大量概念。其中很多概念是Visual Basic 程序員或C/C+ 程序員所熟悉的,但是這些概念的精確定義可能不同。1.1聲明Visual Basic 程序是由命名的實體構(gòu)成的。這些實體通過聲明引入,用來表示程序的“意思”。從較高層面來說,命名空間是用來組織其他實體的實體(如嵌套的命名空間和類型。類型是用于描述值和定義可執(zhí)行代碼的實體。類型可以包含嵌套類型和類型成員。類型成員包括常量、變量、方法、運算符、屬性、事件、枚舉值和構(gòu)造函數(shù)??砂渌麑嶓w的實體定義聲明空間。通過聲明或繼承將實體引入聲明空間;包含實體的聲明空間稱為實體的聲明

2、上下文。在聲明空間中聲明了一個實體,就等于定義了一個新聲明空間,該空間可以包含進(jìn)一步嵌套的實體聲明;由此,程序中的聲明將形成聲明空間的層次結(jié)構(gòu)。除重載的類型成員之外,聲明將同一類型的同名實體引入同一聲明上下文的做法是無效的。另外,聲明空間永遠(yuǎn)不能包含不同種類的同名實體;例如,聲明空間永遠(yuǎn)不能包含名稱相同的變量和方法。 命名空間的聲明空間是“開放式”的,因此兩個具有相同的完全限定名的命名空間聲明將構(gòu)成同一個聲明空間。在下面的示例中,兩個命名空間聲明提供相同的聲明空間,它們聲明了兩個類,完全限定名分別為Data.Customer和Data.Order:Namespace DataClass Cus

3、tomerEnd ClassEnd NamespaceNamespace DataClass OrderEnd ClassEnd Namespace由于兩個聲明共同構(gòu)成同一個聲明空間,因此如果每個聲明中都包含一個同名類的聲明,則將導(dǎo)致編譯時錯誤。1.1.1重載和簽名在聲明空間中聲明同一類型的同名實體的唯一途徑是通過重載。只能重載方法、運算符、實例構(gòu)造函數(shù)和屬性。重載的類型成員必須具有唯一的簽名。類型成員的簽名由類型成員名稱、類型參數(shù)數(shù)目以及成員參數(shù)的數(shù)目和類型組成。轉(zhuǎn)換運算符的簽名中還包含運算符的返回類型。以下實體不是成員簽名的組成部分,因此不能進(jìn)行重載:類型成員的修飾符(如Shared或Pr

4、ivate。參數(shù)的修飾符(如ByVal或ByRef。參數(shù)名。方法或運算符的返回類型(除轉(zhuǎn)換運算符之外或?qū)傩缘脑仡愋?。類型參?shù)約束。下面的示例演示了一個重載方法聲明集及其簽名。因為有若干個方法聲明具有相同的簽名,所以此聲明無效。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

5、' Signature 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( ' Sig

6、nature is F9!1(.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ù)的方法視為具有多個簽名,可通過調(diào)用方傳入的每組參數(shù)都有一

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ù)提供的類型參數(shù),定義可以包含具有相同簽名的成員的一般類型。重載解決方案規(guī)則用于嘗試消除這些重載之間的歧義,但有時候歧義是無法消除的。例如:Class C(Of TSub F(x As IntegerEnd SubSub F(x As TEnd SubSub G(Of U(x As T, y A

8、s UEnd SubSub G(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 Module1.2范圍實體名的范圍是所有聲明空間的集合,在該范圍內(nèi)可以無限制引用該名稱。一般來說,實體名的范圍是其整個聲明上下文;但實體聲明也可能包含同名實體的嵌套聲明。此種情況

9、下,嵌套實體會隱藏外部實體,只能通過限定來訪問被隱藏的實體。嵌套導(dǎo)致的隱藏會在如下情況產(chǎn)生:名稱空間中嵌套名稱空間或類型時;在類型中嵌套其他類型時;在類型成員體中。聲明嵌套導(dǎo)致的隱藏總是隱式發(fā)生,不需要明確的語法。在下面的示例中,在F方法中,局部變量i隱藏了實例變量i,但在G方法中,i仍引用實例變量。Class TestPrivate i As Integer = 0Sub F(Dim i As Integer = 1End SubSub G(i = 1End SubEnd Class當(dāng)內(nèi)部范圍中的名稱隱藏外部范圍中的名稱時,它會隱藏該名稱的所有重載匹配項。在下面的示例中,因為內(nèi)層聲明隱藏了F

10、的所有外層匹配項,所以調(diào)用F(1將調(diào)用在Inner中聲明的F。同樣的原因,調(diào)用F("Hello"會出現(xiàn)錯誤。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 Class1.3繼承在繼承關(guān)系中,一種類型(派生類型是由其他類型

11、(基類型派生的,因此,該派生類型的聲明空間將隱式包含可訪問的非構(gòu)造函數(shù)類型成員,以及該派生類型的基類型的嵌套類型。在下面的示例中,類A是B的基類,B派生自A。Class AEnd ClassClass BInherits AEnd Class因為A未顯式指定基類,所以其基類為隱式指定的Object。繼承的一些重要性質(zhì)為:繼承是可傳遞的。如果類型C派生自類型B,并且類型B派生自類型A,則類型C將繼承類型B以及類型A所聲明的類型成員。派生類型只能擴(kuò)展(而無法縮小其基類型的范圍。派生類型可以添加新的類型成員,并可以隱藏繼承的類型成員,但它不能移除繼承的類型成員的定義。因為某類型的實例包含其基類型的所

12、有類型成員,所以始終存在從派生類型到基類型的轉(zhuǎn)換。除Object類型外,所有類型都必須有基類型。因此,Object是所有類型的最終基類型,所有類型都能轉(zhuǎn)換為該類型。不允許循環(huán)派生。即如果類型B派生自類型A,則類型A直接或間接派生自類型B是錯誤的。某個類型不可以直接或間接派生自其嵌套類型。由于存在類間的循環(huán)依賴,下面的示例產(chǎn)生了編譯時錯誤。Class AInherits BEnd ClassClass BInherits CEnd ClassClass CInherits AEnd Class由于B通過類 A 間接派生自其嵌套類C,下面的示例也產(chǎn)生了編譯時錯誤。Class AInherits B

13、.CEnd ClassClass BInherits APublic Class CEnd ClassEnd Class因為A未派生自類B,所以下面的示例不會產(chǎn)生錯誤。Class AClass BInherits AEnd ClassEnd Class1.3.1MustInherit 和NotInheritable 類MustInherit類是不完整的類型,只能作為基類型。MustInherit類無法實例化,所以對其使用New運算符也會產(chǎn)生錯誤??梢月暶鱉ustInherit類的變量;對這些變量只能賦予Nothing,或賦予派生自相應(yīng)MustInherit類的某個類的值。如果某個常規(guī)類派生自M

14、ustInherit類,該常規(guī)類必須重寫所有繼承的MustOverride成員。例如:MustInherit Class APublic MustOverride Sub F(End ClassMustInherit Class BInherits APublic Sub G(End SubEnd ClassClass CInherits BPublic Overrides Sub F(End SubEnd ClassMustInherit類A引入MustOverride方法F。類B引入其他方法G,但不提供對F的實現(xiàn)。因此,類B也必須聲明為MustInherit。類C重寫F并提供實際的實現(xiàn)。因

15、為類 C 中沒有未處理的 MustOverride成員,所以該類不必是MustInherit。NotInheritable類不能派生其他類。NotInheritable類主要用于防止發(fā)生意外的派生。在下面的示例中,類B嘗試從NotInheritable類A派生,因此會產(chǎn)生錯誤。類不能同時聲明為MustInherit和NotInheritable。NotInheritable Class AEnd ClassClass B' Error, a class cannot derive from a NotInheritable class.Inherits AEnd Class1.3.2接

16、口和多重繼承其他類型只派生自單一基類型,而接口則可以派生自多個基接口。因此,接口可以從不同的基接口繼承同名的類型成員。在這種情況下,多重繼承的名稱在派生的接口中不可用,并且通過派生接口引用這些類型成員中的任何一個都會導(dǎo)致編譯時錯誤(無論是簽名還是重載。必須轉(zhuǎn)而通過基接口名稱引用沖突的類型成員。在下面的示例中,前兩個語句會導(dǎo)致編譯時錯誤,因為多重繼承成員Count在接口IListCounter中不可用:Interface IListProperty Count( As IntegerEnd InterfaceInterface ICounterSub Count(i As IntegerEnd

17、InterfaceInterface IListCounterInherits IListInherits 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, invoke

18、s ICounter.Count.End SubEnd Module如上例所示,將x強(qiáng)制轉(zhuǎn)換為正確的基接口類型解決了多義性問題。此類強(qiáng)制轉(zhuǎn)換沒有運行時開銷,它們只是在編譯時將該實例視為派生程度較小的類型而已。當(dāng)單個類型成員通過多個路徑繼承自同一基接口時,會將該類型成員視為只繼承過一次。換言之,派生的接口只包含繼承自特定基接口的每個類型成員的一個實例。例如:Interface IBaseSub F(i As IntegerEnd InterfaceInterface ILeftInherits IBaseEnd InterfaceInterface IRightInherits IBaseEnd

19、 InterfaceInterface IDerivedInherits ILeft, IRightEnd InterfaceClass DerivedImplements IDerived' Only have to implement F once.Sub F(i As Integer Implements IDerived.FEnd SubEnd Class如果通過繼承層次結(jié)構(gòu)在一條路徑中隱藏了某個類型成員名稱,則將在所有路徑中隱藏該名稱。在下面的示例中,IBase.F成員被ILeft.F成員隱藏,但未在IRight中隱藏:Interface IBaseSub F(i As In

20、tegerEnd InterfaceInterface ILeftInherits IBaseShadows Sub F(i As IntegerEnd InterfaceInterface 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

21、.F(1 ' Invokes ILeft.F.CType(d, IRight.F(1 ' Invokes IBase.F.End SubEnd Class調(diào)用 d.F(1時會選擇ILeft.F,即使IBase.F看起來并未在IRight中的訪問路徑中隱藏。因為從IDerived到ILeft到IBase的訪問路徑隱藏了IBase.F,所以從IDerived到IRight到IBase的訪問路徑中也隱藏了該成員。1.3.3隱藏派生類型通過重新聲明繼承的類型成員的名稱來隱藏該名稱。隱藏某個名稱的操作并不會移除具有該名稱的繼承的類型成員;該操作只是使所有具有該名稱的繼承的類型成員在派生類

22、中不可用。隱藏的聲明可以是任何類型的實體??芍剌d的實體可以選擇兩種隱藏形式。使用Shadows關(guān)鍵字指定按名稱隱藏。按名稱隱藏的實體可以隱藏基類中具有該名稱的任何項,包括所有的重載。使用Overloads關(guān)鍵字指定按名稱和簽名隱藏。按名稱和簽名隱藏的實體隱藏具有該名稱并與該實體具有相同簽名的任何項。例如: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

23、.Overloads Sub F(i As IntegerEnd Sub' Hides G( and G(Integer.Shadows Sub G(i As IntegerEnd SubEnd ClassModule TestSub Main(Dim x As New Derived(x.F( ' Calls Base.F(.x.G( ' Error: Missing parameter.End SubEnd Module按名稱和簽名隱藏帶ParamArray參數(shù)的方法時,只隱藏單個簽名,而不是所有可能的擴(kuò)展簽名。即使隱藏方法的簽名與被隱藏方法的未擴(kuò)展簽名相匹配時也是

24、如此。以下示例Class BaseSub F(ParamArray x( As IntegerConsole.WriteLine("Base"End SubEnd ClassClass 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ò)展形式的

25、簽名相同。相反,帶ParamArray參數(shù)的方法只隱藏與之具有相同簽名的方法,而不是所有具有可能的擴(kuò)展簽名的方法。以下示例Class BaseSub F(x As IntegerConsole.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

26、.F(10End SubEnd Module輸出Base,(即使Derived.F的擴(kuò)展形式與Base.F具有相同的簽名。如果對未指定Shadows或Overloads的隱藏方法或?qū)傩月暶髁薕verrides,則該隱藏方法或?qū)傩圆捎肙verloads,否則采用Shadows。如果重載實體集的一個成員指定了Shadows或Overloads關(guān)鍵字,則該實體集的所有成員都必須指定該關(guān)鍵字。不能同時指定Shadows和Overloads關(guān)鍵字。不能在標(biāo)準(zhǔn)模塊中指定Shadows 或Overloads;標(biāo)準(zhǔn)模塊中的成員隱式隱藏從Object繼承的成員。隱藏通過接口繼承進(jìn)行多重繼承(因此不可用的類型成員

27、的名稱是有效的,這樣使該名稱在派生接口中可用。例如:Interface ILeftSub F(End InterfaceInterface IRightSub F(End InterfaceInterface 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 IRigh

28、t.F.End SubEnd Module因為方法可以隱藏被繼承方法,所以,類可以包含多個簽名相同的Overridable方法。這不會造成多義性問題,因為只有派生程度最大的那個方法是可見的。在下面的示例中,C類和D類包含兩個簽名相同的Overridable方法:Class APublic Overridable Sub F(Console.WriteLine("A.F"End SubEnd ClassClass BInherits APublic Overrides Sub F(Console.WriteLine("B.F"End SubClass CI

29、nherits BPublic Shadows Overridable Sub F(Console.WriteLine("C.F"End SubEnd ClassClass 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示例中有兩個Over

30、ridable方法:一個由類A引入,另一個由類C引入。類C引入的方法將隱藏從類A繼承的方法。因此,類D中的Overrides聲明會重寫類C引入的方法,類D不可能重寫類A引入的方法。此例產(chǎn)生的輸出如下:B.FB.FD.FD.F通過未隱藏Overridable方法的派生程度最小的類型來訪問類D的實例,可以調(diào)用該被隱藏方法。隱藏MustOverride方法是無效的,因為大多數(shù)情況下該操作會使類不可用。例如:MustInherit Class BasePublic MustOverride Sub F(MustInherit Class DerivedInherits BasePublic Shado

31、ws Sub F(End SubEnd ClassClass MoreDerivedInherits Derived' Error: MustOverride method Base.F is not overridden.End Class在本示例中,需要類MoreDerived來重寫MustOverride方法Base.F,但是因為類Derived隱藏了Base.F,所以該操作是不可行的。無法為Derived聲明有效的子代。與隱藏外部范圍中的名稱不同,隱藏繼承范圍中的可訪問名稱會導(dǎo)致發(fā)出警告,如下面的示例所示:Class BasePublic Sub F(End SubPrivat

32、e Sub G(End SubEnd ClassClass DerivedInherits BasePublic Sub F( ' Warning: shadowing an inherited name.End SubPublic Sub G( ' No warning, Base.G is not accessible here.End SubEnd Class在類Derived中聲明方法F會導(dǎo)致警告。隱藏繼承的名稱不是一個錯誤,因為這會限制基類按自身情況進(jìn)行改進(jìn)。例如,由于更高版本的Base類引入了該類的早期版本中不存在的方法F,就可能發(fā)生上述情況。如果上述情況是一個錯誤

33、,當(dāng)基類屬于一個單獨進(jìn)行版本控制的類庫時,對該基類的任何更改都有可能導(dǎo)致它的派生類變得無效。通過使用Shadows 或Overloads 修飾符可以消除因隱藏繼承的名稱導(dǎo)致的警告:Public Sub F(End SubEnd ClassClass DerivedInherits BasePublic Shadows Sub F( 'OK.End SubEnd ClassShadows修飾符指示要隱藏繼承的成員。如果沒有可隱藏的類型成員名稱,指定Shadows或Overloads修飾符不會導(dǎo)致錯誤。在聲明一個新成員時,僅在該新成員的范圍內(nèi)隱藏繼承的成員,如下面的示例所示:Class B

34、asePublic Shared Sub F(End SubEnd ClassClass DerivedInherits BasePrivate Shared Shadows Sub F( ' Shadows Base.F in class Derived only.End SubEnd ClassClass MoreDerivedInherits DerivedShared Sub G(F( ' Invokes Base.F.End SubEnd Class在上面的示例中,Derived 類的方法F的聲明隱藏了繼承自Base類的方法F,但因為Derived 類的新方法 F 具

35、有Private訪問類型,所以其作用域不會擴(kuò)展到MoreDerived類。因此,MoreDerived.G中調(diào)用F(是有效的并將調(diào)用Base.F。對于重載的類型成員,將整個重載的類型成員集視為所有成員都具有最高訪問級別,以便于進(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(

36、 ' Error. No accessible member with this signature.End SubEnd Class在此示例中,即使在Derived中聲明F(時使用的是Private訪問類型,聲明重載F(Integer時也使用Public訪問類型。因此,為便于進(jìn)行隱藏,將Derived 中的名稱F視為Public,因此兩種方法都隱藏Base中的F。1.4實現(xiàn)當(dāng)某個類型聲明其實現(xiàn)一個接口,并且該類型實現(xiàn)該接口的所有類型成員時,會存在一個實現(xiàn)關(guān)系。實現(xiàn)某個特定接口的類型可以轉(zhuǎn)換為該接口。無法實例化接口,但聲明接口變量是有效的;對這些變量所賦的值只能是實現(xiàn)該接口的類的值。例

37、如:Interface ITestableFunction Test(value As Byte As BooleanEnd InterfaceClass TestableClassImplements ITestableFunction Test(value As Byte As Boolean ImplementsITestable.TestReturn value > 128End FunctionEnd ClassModule TestSub F(Dim x As ITestable = New TestableClassDim b As Booleanb = x.Test(34

38、End SubEnd Module即使某些方法不能從正在實現(xiàn)的派生接口直接訪問,實現(xiàn)接口(具有多重繼承的類型成員的類型也必須仍然實現(xiàn)這些方法。例如:Interface ILeftSub Test(End InterfaceInterface IRightSub Test(End InterfaceInterface ILeftRightInherits ILeft, IRightEnd InterfaceClass LeftRightImplements ILeftRight' Has to reference ILeft explicitly.Sub TestLeft( Implem

39、ents ILeft.TestEnd Sub' Has to reference IRight explicitly.Sub TestRight( Implements IRight.TestEnd Sub' Error: Test is not available in ILeftRight.Sub TestLeftRight( Implements ILeftRight.TestEnd SubEnd Class雖然MustInherit類必須提供對實現(xiàn)的接口的所有成員的實現(xiàn);但是,通過將方法聲明為MustOverride,這些類可以延遲實現(xiàn)這些方法。例如:Interface

40、 ITestSub Test1(Sub Test2(End InterfaceMustInherit Class TestBaseImplements ITest' Provides an implementation.Sub Test1( Implements ITest.Test1End Sub' Defers implementation.MustOverride Sub Test2( Implements ITest.Test2End ClassClass TestDerivedInherits TestBase' Have to implement MustO

41、verride method.Overrides Sub Test2(End SubEnd Class某個類型可以選擇重新實現(xiàn)其基類型實現(xiàn)的接口。要重新實現(xiàn)該接口,該類型必須顯式聲明實現(xiàn)該接口。重新實現(xiàn)接口的類型可以選擇只重新實現(xiàn)部分(而不是全部接口成員任何未被重新實現(xiàn)的成員將繼續(xù)使用基類型的實現(xiàn)。例如:Class TestBaseImplements ITestSub Test1( Implements ITest.Test1Console.WriteLine("TestBase.Test1"End SubSub Test2( Implements ITest.Test2

42、Console.WriteLine("TestBase.Test2"End SubEnd ClassClass TestDerivedInherits TestBaseImplements ITest ' Required to re-implementSub DerivedTest1( Implements ITest.Test1Console.WriteLine("TestDerived.DerivedTest1"End SubEnd ClassModule TestSub Main(Dim Test As ITest = New TestD

43、erived(Test.Test1(Test.Test2(End SubEnd Module此示例輸出:TestDerived.DerivedTest1TestBase.Test2如果派生類型實現(xiàn)的接口的基接口是通過該派生類型的基類型實現(xiàn)的,則派生類型可以選擇僅實現(xiàn)該接口中尚未由基類型實現(xiàn)的類型成員。例如:Interface IBaseSub Base(End InterfaceInterface IDerivedInherits IBaseSub Derived(End InterfaceClass BaseImplements IBasePublic Sub Base( Implement

44、s IBase.BaseEnd SubEnd ClassClass DerivedInherits BaseImplements IDerived' Required: IDerived.Derived not implemented by Base.Public Sub Derived( Implements IDerived.DerivedEnd SubEnd Class在基類型中使用可重寫方法也可以實現(xiàn)接口方法。在這種情況下,派生類型也可以重寫可重寫的方法,從而更改接口的實現(xiàn)。例如:Class BaseImplements ITestPublic Sub Test1( Imple

45、ments ITest.Test1Console.WriteLine("TestBase.Test1"End SubPublic Overridable Sub Test2( Implements ITest.Test2Console.WriteLine("TestBase.Test2"End SubEnd ClassClass DerivedInherits Base' Overrides base implementation.Public Overrides Sub Test2(Console.WriteLine("TestDer

46、ived.Test2"End SubEnd Class1.4.1實現(xiàn)方法通過為方法提供Implements子句,類型可以為已實現(xiàn)的接口實現(xiàn)類型成員。兩個類型成員必須具有相同數(shù)量的參數(shù),參數(shù)的所有類型和修飾符也必須匹配(包括可選參數(shù)的默認(rèn)值,返回類型必須匹配,方法參數(shù)的所有約束也必須匹配。例如:Interface ITestSub F(ByRef x As IntegerSub G(Optional y As Integer = 20Sub H(Paramarray z( As IntegerEnd InterfaceClass TestImplements ITest' Er

47、ror: ByRef/ByVal mismatch.Sub F(x As Integer Implements ITest.FEnd Sub' Error: Defaults do not match.Sub G(Optional y As Integer = 10 Implements ITest.GEnd Sub' Error: Paramarray does not match.Sub H(z( As Integer Implements ITest.HEnd SubEnd Class如果類型成員符合上述所有標(biāo)準(zhǔn),則單個方法可以實現(xiàn)任意數(shù)量的接口類型成員。例如:Inter

48、face ITestSub F(i As IntegerSub G(i As IntegerEnd InterfaceClass TestImplements ITestSub F(i As Integer Implements ITest.F, ITest.GEnd SubEnd Class實現(xiàn)常規(guī)接口的某個方法時,實現(xiàn)的方法必須提供與該接口的類型參數(shù)相對應(yīng)的類型參數(shù)。例如:Interface I1(Of U, VSub M(x As U, y As List(Of VEnd InterfaceClass C1(Of W, XImplements I1(Of W, X' W corr

49、esponds 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 As String, y As List(Of Integer _Implements I1(Of String, Integer.MEnd SubEn

50、d Class請注意,對于某些類型實參集來說,泛型接口可能是無法實現(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 Class1.5多態(tài)性多態(tài)性可以使方法或?qū)傩缘膶崿F(xiàn)多樣化。使用多態(tài)性,相同的方法或?qū)傩钥梢詧?zhí)行不同的操作,具體取決于調(diào)用該方法或?qū)傩缘膶嵗倪\行時類型。方法或?qū)傩缘亩鄳B(tài)性稱為可重寫性

51、。相反,不可重寫的方法或?qū)傩缘膶崿F(xiàn)是固定的;不論是針對在其中聲明方法或?qū)傩缘念惖膶嵗{(diào)用方法或?qū)傩?還是針對派生類的實例調(diào)用方法或?qū)傩?實現(xiàn)都是相同的。當(dāng)調(diào)用不可重寫的方法或?qū)傩詴r,實例的編譯時類型是決定因素。例如:Class BasePublic Overridable Property X( As IntegerGetEnd GetSetEnd SetEnd PropertyEnd ClassClass DerivedInherits BasePublic Overrides Property X( As IntegerGetEnd GetSetEnd SetEnd PropertyEnd

52、 ClassModule TestSub F(Dim Z As BaseZ = New Base(Z.X = 10 ' Calls Base.XZ = New Derived(Z.X = 10 ' Calls Derived.XEnd SubEnd Module可重寫方法也可以是MustOverride,這意味著方法不提供方法體,必須將其重寫。只有在MustInherit類中才允許使用MustOverride。在下面的示例中,Shape類定義了可以繪制自身的幾何形狀對象的抽象表示形式:MustInherit Public Class ShapePublic MustOverri

53、de Sub Paint(g As Graphics, 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方法是MustOv

54、erride,因為不存在有意義的默認(rèn)實現(xiàn)。Ellipse和Box類是具體的Shape實現(xiàn)。因為這些類不是MustInherit 類,所以它們需要重寫Paint方法并提供實際的實現(xiàn)。基訪問引用MustOverride方法是錯誤的,如下例所示: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)用出錯,因為它引用Mus

55、tOverride方法。1.5.1重寫的方法通過聲明具有相同名稱和簽名的方法并用Overrides修飾符標(biāo)記聲明,類型可重寫繼承的可重寫方法。下面列出了對重寫方法的附加要求。Overridable方法聲明用于引入新方法,而Overrides方法聲明用于替換繼承的方法實現(xiàn)。重寫方法可以聲明為NotOverridable,這樣可防止在派生類型中對該方法進(jìn)行進(jìn)一步重寫。實際上,NotOverridable方法在任何進(jìn)一步派生的類中都變?yōu)椴豢芍貙憽U埧聪旅娴氖纠?Class APublic Overridable Sub F(Console.WriteLine("A.F"End S

56、ubPublic Overridable Sub G(Console.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在此示例中,類B提供兩個Overrides方法:具有NotOverridable修飾符的方法F以及沒有該修飾符的方法G。使用NotOverridable修飾符可防止類C進(jìn)一步重寫方法F。重寫方法也可以聲明為MustOverride,即使該方法要重寫的方法未聲明為MustOverride也是如此。這需要包含類聲明為MustInherit,并且未聲明為MustInherit的所有進(jìn)一步派生的類都必須重寫該方法。例如:Class APublic Overridable Sub F(Console.Wr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論