面向对象编程/接口
外观
< 面向对象编程
接口允许一个类根据上下文暴露不同的属性和方法集。例如,假设您正在编写一个管理客户的 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
接口和继承都可以用来解决将不同对象集体处理的问题。例如,如果您有 Cat 类和 Dog 类,但有一些例程需要一起处理它们,您可以
- 创建一个 Animal 基类,其中包含 Cat 和 Dog 共有的过程,并让 Cat 和 Dog 继承自 Animal,或者
- 创建一个 IAnimal 接口,并让 Cat 和 Dog 都实现该接口。
使用哪种方法取决于几个因素。一般来说
- 如果您要扩展现有类,则使用继承。例如,如果您已经有了 Animal 类,然后发现需要区分 Cat 和 Dog
- 如果您只是想将不同的对象视为相同,则使用接口。例如,您已经有了 Cat 和 Dog 类,然后发现需要以类似的方式操作它们