跳至内容

面向对象编程/接口

来自维基教科书,开放世界中的开放书籍

接口允许一个类根据上下文暴露不同的属性和方法集。例如,假设您正在编写一个管理客户的 Visual Basic 2005 应用程序。客户可以是个人,也可以是组织。程序的一部分生成客户的地址标签。

您可以这样定义个人

Class Person
    Public LastName As String
    Public FirstName As String
    Public Address As String
End Class

您也可以这样定义组织

Class Organization
    Public Name As String
    Public MailingAddress As String
    Public BuildingAddress As String
End Class

如您所见,个人和组织之间的主要区别在于

  • 个人既有姓又有名,而组织只有一个名称
  • 组织有单独的邮寄地址,而个人只有一个地址

为了使您可以使用同一个例程打印地址标签,您创建了一个名为“IAddressLabel”的接口(按照惯例,接口的名称应该以大写字母 I 开头)。

Interface IAddressLabel
    ReadOnly Property Name() As String
    ReadOnly Property Address() As String
End Interface

现在您修改 Person 类以实现此接口。主要需要注意的是,Person 的姓和名在标签上合并在一起。

Class Person
    Implements IAddressLabel
    Public LastName As String
    Public FirstName As String
    Public Address As String
    Public ReadOnly Property Address1() As String Implements IAddressLabel.Address
        Get
            Return Address
        End Get
    End Property
    Public ReadOnly Property Name() As String Implements IAddressLabel.Name
        Get
            Return FirstName & " " & LastName 'combine the first and last names for the address label
        End Get
    End Property
End Class

现在您修改 Organization 类以实现 IAddressLabel 接口。请注意,标签上的地址是邮寄地址,而不是建筑地址。

Class Organization
    Implements IAddressLabel
    Public Name As String
    Public MailingAddress As String
    Public BuildingAddress As String
    Public ReadOnly Property Address() As String Implements IAddressLabel.Address
        Get
            Return MailingAddress 'Use the mailing address for the address label
        End Get
    End Property
    Public ReadOnly Property Name1() As String Implements IAddressLabel.Name
        Get
            Return Name
        End Get
    End Property
End Class

现在您可以将不同的对象组合在一起,形成一个地址标签集合!

Sub Main()
    'create a person object
    Dim Bill As New Person
    Bill.FirstName = "William"
    Bill.LastName = "Jones"
    Bill.Address = "123 Test Rd Testville 9123"
    'create another person object
    Dim Sally As New Person
    Sally.FirstName = "Sally"
    Sally.LastName = "Smith"
    Sally.Address = "999 Sample Ave Testburg 9222"
    'create an Organization object
    Dim WidgetsInc As New Organization
    WidgetsInc.Name = "Widgets Incorporated"
    WidgetsInc.BuildingAddress = "9123 Avenue Rd Sampletown 9876"
    WidgetsInc.MailingAddress = "P.O. Box 123 Sampletown 9876"
    'Because all three objects implement the IAddressLabel interface, we can put them in the same array
    Dim MailingList(2) As IAddressLabel
    MailingList(0) = Bill
    MailingList(1) = Sally
    MailingList(2) = WidgetsInc
    'loop through, displaying the address label for each object
    Dim i As Integer
    For i = 0 To 2
        MsgBox(MailingList(i).Name & vbCrLf & MailingList(i).Address)
    Next i
End Sub

接口 vs. 继承

[编辑 | 编辑源代码]

接口和继承都可以用来解决将不同对象集体处理的问题。例如,如果您有 Cat 类和 Dog 类,但有一些例程需要一起处理它们,您可以

  • 创建一个 Animal 基类,其中包含 Cat 和 Dog 共有的过程,并让 Cat 和 Dog 继承自 Animal,或者
  • 创建一个 IAnimal 接口,并让 Cat 和 Dog 都实现该接口。

使用哪种方法取决于几个因素。一般来说

  • 如果您要扩展现有类,则使用继承。例如,如果您已经有了 Animal 类,然后发现需要区分 Cat 和 Dog
  • 如果您只是想将不同的对象视为相同,则使用接口。例如,您已经有了 Cat 和 Dog 类,然后发现需要以类似的方式操作它们

组件的引入

[编辑 | 编辑源代码]

继承 vs 委托

[编辑 | 编辑源代码]

动态继承

[编辑 | 编辑源代码]
华夏公益教科书