物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(五)--覆寫Overrides

覆寫(Overrides)

我們從基礎Class繼承之後,我們還可以依照需求對從基礎Class繼承的方法進行擴充或改寫,此機制稱覆寫

方法覆寫

於基礎Class宣告Overridable方法(可覆寫方法),使方法能被覆寫。依前一篇範例,我們在Animals.vb裡新增可被覆寫的方法。

Public Class Animals

    Public Overridable Function Style() As String
        'Do Something ...
    End Function

    Public Overridable Sub Sound()
        'Do Something ...
    End Sub
End Class

然後於衍生Class宣告Overrides方法,來覆寫基礎Class的方法。我們在Cat.vb中覆寫Animals.vb的方法。

Public Class Cat
    Inherits Animals

    Public Overrides Function Style() As String
        Return MyBase.Style()
    End Function

    Public Overrides Sub Sound()
        MyBase.Sound()
    End Sub
End Class

一但衍生Class覆寫了基礎Class的方法,在衍生Class中所引用的將一律是覆寫的方法

MyBase呼叫基礎Class的方法

在衍生Class覆寫基礎Class的方法後,呼叫一律是覆寫的方法,但如果有需要呼叫基礎Class的方法,則需要使用MyBase關鍵字來進行基礎Class的方法引用

在衍生Class建立新方法

在衍生Class定義的成員與基礎Class定義的成員有相同的名稱,此時Complier必須界定此成員是由衍生Class定義實作,而非繼承自基礎Class。當你要在衍生Class提供一個同名方法,而非基礎Class的覆寫方法,必須使用Shadows關鍵字。

衍生Class建立新方法

依前一篇的範例,我們在Dog.vb類別檔中建立兩個新函數。

Public Class Dog
    Inherits Animals

    Public Shadows Function Style() As String
        'Class Dog自有方法
    End Function

    Public Shadows Sub Sound()
        'Class Dog自有方法
    End Sub

End Class

建構式繼承

在繼承關係中,基礎Class與衍生Class的建構式是各自獨立。

Animals.vb建構式:
Public Class Animals

    Sub New()
        'Animals建構式
    End Sub
End Class

Pig.vb建構式:
NotInheritable Class Pig
    Inherits Animals

    Sub New()
        'Pig建構式
    End Sub
End Class

當我們進行物件的建立時(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("小花")。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。