覆寫(Overrides)
我們從基礎Class繼承之後,我們還可以依照需求對從基礎Class繼承的方法進行擴充或改寫,此機制稱
覆寫。
方法覆寫
於基礎Class宣告
Overridable方法(可覆寫方法),使方法能被覆寫。依前一篇範例,我們在Animals.vb裡新增可被覆寫的方法。
03 | Public Overridable Function Style() As String |
07 | Public Overridable Sub Sound() |
然後於衍生Class宣告
Overrides方法,來
覆寫基礎Class的方法。我們在Cat.vb中覆寫Animals.vb的方法。
04 | Public Overrides Function Style() As String |
08 | Public Overrides Sub Sound() |
一但衍生Class覆寫了基礎Class的方法,
在衍生Class中所引用的將一律是覆寫的方法。
MyBase呼叫基礎Class的方法
在衍生Class覆寫基礎Class的方法後,呼叫一律是覆寫的方法,但如果有需要呼叫基礎Class的方法,則需要使用
MyBase關鍵字來進行基礎Class的方法引用。
在衍生Class建立新方法
在衍生Class定義的成員與基礎Class定義的成員有相同的名稱,此時Complier必須界定此成員是由衍生Class定義實作,
而非繼承自基礎Class。當你要在衍生Class提供一個
同名方法,而非基礎Class的覆寫方法,必須使用
Shadows關鍵字。
衍生Class建立新方法
依前一篇的範例,我們在Dog.vb類別檔中建立兩個新函數。
04 | Public Shadows Function Style() As String |
08 | Public Shadows Sub Sound() |
建構式繼承
在繼承關係中,基礎Class與衍生Class的建構式是各自獨立。
Animals.vb建構式:
Pig.vb建構式:
1 | NotInheritable Class Pig |
當我們進行物件的建立時(Dim pig3 As New Pig),程式執行流程:
呼叫基礎Class建構式(Animals)→呼叫衍生Class建構式(Pig)→建立Object(pig3)
- 在Class中若沒有設定任何建構式,預設會呼叫"無參數"的建構式。
- 若在衍生Class中使用MyBase.New()呼叫基礎Class的建構式後,則衍生Class的預設建構式不會被執行。
- 若基礎Class中無任何"無參數"建構式,則衍生Class必須明確引用基礎Class的建構式。
例如:Animals.vb中只有Sub New(ByVal name As String),但無Sub New(),則所有衍生Class(Cat.vb, Dog.vb, Pig.vb)都必須明確引用Animals.vb裡的建構式,MyBase.New("小花")。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。