將衍生類別對象指派給基類引用。程式要想多態性的處理對象,這是非常基本的部分。
所謂引用就是聲明資料類型。
然後就是執行個體化。“new”.
衍生類別引用指派給基類引用:point = circle
此時如果調用point的方法,因為將衍生類別引用指派給基類引用,所以是circle的方法
而不是point的方法。
將基類對象指派給衍生類別引用(無強制類型轉換),會發生語法錯誤。
衍生類別引用指派給基類引用,可通過強制類型轉換,只有這樣才能向那個對象發送未在
基類中出現的訊息。(表示調用一個對象的方法和屬性)
因為衍生類別包含與基類對象所有成員對應的成員,但衍生類別還可能有附加成員。所以,
不進行顯式的強制類型轉換,就不能將基類的引用指派給衍生類別引用。option strict
在on 的狀態。否則,附加的衍生類別成員會]進入未定義的狀態。
不會執行個體化任何對象的類,稱為抽象類別。(mustinherit)
所以,派聲類必須覆蓋繼承抽象的方法和屬性,使那些衍生類別的對象被執行個體化。
例如:有人讓你畫一個形狀,那麼具體畫什麼形狀呢?具體類提供這些細節。
許多良好的物件導向的系統都用mustinherit積累開始以各類階層。有時要佔據類
階層頂部的好幾個層級。
關鍵字mustoverride可將一個方法和屬性聲明為抽象的。每個衍生類別必須覆蓋所有的
mustoverride方法和屬性。使用關鍵字(overrides)
mustoverride和overridable方法區別在於,後者有具體的方法實現。並允許衍生類別
覆蓋。而前者沒有具體實現,並且衍生類別必須要覆蓋其方法和屬性。
在面向對對象編程,經常要用到迭代器類。它能便利容器(比如數組)內所有對象
例如:
dim arrayofshapes as cshape() = new shape(2)
arrayofshapes(0) = point
arrayofshapes(0) = circle
arrayofshapes(0) = cylinder(圓柱)
dim shape as cshape
for each shape in arrayofshapes
next
建立和使用介面:
介面指定了類必須是實現的一系列public服務(也就是方法和屬性)。
介面要用關鍵字interface開頭,要使用介面,類必須指出實現了自己的implments
介面。
可讓介面提供一個屬性和方法,讓這些類的對象來實現,已返回每個對象的方法或屬性。
委託:
在事件通訊中,事件發送方類不知道哪個對象或方法將接收到(處理)它引發的事件。
所需要的是在源和接收方之間存在一個媒介(或類似指標的機制)。.NET Framework
定義了一個特殊的類型(Delegate),該類型提供函數指標的功能。
委託是一個可以對方法進行引用的類。與其他的類不同,委託類具有一個簽名,並且它只能
對與其簽名匹配的方法進行引用。這樣,委託就等效於一個型別安全函數指標或一個回調。
委託是一種參考型別,它參考型別的 Shared 方法或對象的執行個體方法。在其他語言中,
與委託最接近的是函數指標,但函數指標只能引用 Shared 函數,而委託可以引用 Shared
和執行個體方法。在後一種情況中,委託不僅儲存對方法進入點的引用,還儲存對用於調用方法
的對象執行個體的引用。
自己理解:委託其實質就是一個方法的地址,通過它可以找到這個方法,並使用它。
這個在多線程的編程中使用到。
例子:
Delegate Sub MySubDelegate(x as integer)
Protected Sub Test()
Dim c2 As New class2()
' Test the delegate.
c2.DelegateTest()
End Sub
Class class1
Sub Sub1(ByVal x As Integer)
MessageBox.Show("The value of x is: " & CStr(x))
End Sub
End Class
Class class2
Sub DelegateTest()
Dim c1 As Class1
Dim msd As MySubDelegate
c1 = New Class1
' Create an instance of the delegate.
msd = AddressOf c1.Sub1
msd(x) ' Call the method.
End Sub
End Class
委託傳遞參數:委託的參數傳遞給class1.sub1的參數,通過這裡可以看出。
還有一種方式,但不能傳遞參數。
dim msd as new methodinvoke(addressof 方法名)
調用時 msd.invoke
委託結合線程使用。