注意上面標記顏色的部分,可以看出:採用不同的訪問方式,實現的結果並不盡相同。也就是說,針對介面實現的方法,與類別本身自帶的實現,是兩回事,這種情況很類似於使用 new 關鍵字建立新的同名成員方法時遭遇的問題。
結果之所以不同,是由於訪問方式不同。若採用「基類」來訪問,顯然獲得的是基類的成員實現。這也是多態的一種體現,但並非不可預知或不可控制的。
看到有人說 VB 很難實現介面映射,實際上並非如此。要解釋這問題,不得不說一下強類型 C# 語法的含義。
基類 objBase = new 基類(); 這語法表示使用「基類」來訪問新建的「基類」實例。換言之,基類 objDevired = new 沒有介面的繼承(); 表示使用基類來訪問新建的「沒有介面的繼承」實例。
介面的訪問同理,在原理上將介面視為一個十分特殊的抽象類別,它與一般抽象類別的區別在於強制了成員的實現(介面語法由編譯器驗證,CLR 未提供限制機制)。所以在某些設計模式中,也可看到採用「介面-抽象類別-具體類別」方式繞開強制成員實現檢查,提高靈活性。
所以 VB.NET 照樣可完成介面映射,因為介面本身的實現機制仍依賴類別的基本特徵。
示例偽程式碼如下:
Friend Interface 介面
Sub 方法()
End Interface
Friend Class 基類
Implements 介面
Private Sub Test()
Sub 介面.方法() Implements 介面.方法
End Class
Friend Class 沒有介面的繼承
Inherits 基類
Public Sub 方法()
End Class
Friend Class 有介面的繼承
Inherits 基類
Implements 介面
Private Sub Test()
Sub 介面.方法() Implements 介面.方法
End Class
但就介面本身而言,是一個便利性工具,在程式設計認知上,不應將它與類別視為「同一類東西」,它是對類別之間關係的一種描述。對類別機制而言,繼承與多態提供父子關係的縱向關係描述,而橫向關係描述反映得不夠好,介面透過一定實現機制部分彌補了這個空缺。
像程式碼描述那樣,介面僅作為便利性工具存在。在面向介面程式設計中,一切圍繞介面進行,可採用介面替換方法實現提供理想方式。雖然比起濫用繼承沒什麼優勢,但它是思想與觀念上的轉變。從本質上說,介面映射與繼承中的 new 一樣,作為技巧用用可以,但本身並非值得推薦的方式。