Visual Basic 语言概念
接口定义
接口定义包含在 Interface 语句和 End Interface 语句之间。在 Interface 语句后面,可以选择性地添加一个 Inherits 语句,由它列举一个或多个继承接口。在声明中,Inherits 语句必须出现在除注释外的所有其他语句之前。接口定义中的语句还有 Event 语句、Sub 语句、Function 语句和 Property 语句。接口不能包含任何实现代码或与实现代码相关的语句,如 End Sub 或 End Property。
默认的接口语句是公共的,也可以将它们显式声明为 Public、Friend、Protected 或 Private。
注意 接口定义中所声明的 Sub 语句、Function 语句或 Property 语句的有效修饰符只有 Overloads 和 Default 关键字。其他的修饰符(如 Public、Private、Friend、Protected、Shared、Static、Overrides、MustOverride 或 Overridable)都不允许使用。
Visual Basic 语言概念
何时使用接口
接口是一种非常有效的编程工具,因为它们让您能够将对象的定义与实现分离,从而可以在不破坏现有应用程序的情况下使对象得以发展完善。接口继承和类继承各有其优缺点,可以在项目中将二者结合使用。本主题和何时使用继承将帮助您根据情况确定最佳的途径。
安全更改代码
接口消除了类继承的一个大问题,即在对设计实施后再对其进行更改时很可能对代码产生破坏。即使类继承允许类从基类继承实现,在类首次发布时仍然会使您不得不为设计做很多的决择。如果原有的设想不正确,并非总可以在以后的版本中对代码进行安全的更改。
例如,假设您定义了一个基类的方法,它需要一个 Integer 参数,而后来又确定该参数应该为 Long 数据类型。您无法安全更改原始类,因为为从原始类派生的类所设计的应用程序可能无法进行正确编译。这一问题会扩大化,因为单个基类会影响几百个子类。
有一种解决方案是定义一个新方法,该方法重载原始类并且采用一个 Long 类型的参数。可是,这样不一定能达到满意的效果,因为一个派生类可能需要对采用整数的方法进行重写,如果取 Long 数据类型的方法不也被重写,该派生类可能无法正常运行。接口解决了这一问题,办法是让您能够发布接受新数据类型的已更新接口。
实现的灵活性
以下是为何使用接口继承而不用类继承的一些其他原因:
在应用程序要求很多可能不相关的对象类型以提供某种功能的情况下,接口的适用性更强。
接口比基类更灵活,因为可以定义单个实现来实现多个接口。
在无需从基类继承实现的情况下,接口更好。
在无法使用类继承的情况下接口是很有用的。例如,结构无法从类继承,但它们可以实现接口。
Visual Basic 语言概念
创建和实现接口
正如接口概述中所解释的,接口对类的属性、方法和事件进行描述,而不提供任何实现。
创建接口
通过为其添加代码对接口进行定义,这些代码以 Interface 关键字及接口名称开始,以 End Interface 语句结束。例如,以下代码定义了一个名为 Encryption 的接口:
Interface Encryption
End Interface添加定义接口所支持的属性、方法和事件的语句。例如,以下代码定义了两个方法、一个属性和一个事件:
Interface Encryption
Function Encrypt(ByVal estring As String) As String
Function Decrypt(ByVal dstring As String) As String
Property EncryptionBits() As Integer
Event FinishedDecoding(ByVal RetVal As Integer)
End Interface实现接口
若正在实现的接口不是项目的一部分,则添加一个对包含该接口的程序集的引用。
创建实现接口的新类,并将 Implements 关键字加入该类名后面的行中。例如,若要用 Xor 加密来实现 Encryption 接口,可以将实现类命名为 XorEnc,如以下代码所示:
Class XorEnc
Implements Encryption
End Class为实现类的属性、方法和事件添加过程,如以下代码所示,该段代码是建立在上一步的示例基础上的:
Class XorEnc
Implements Encryption
Event FinishedDecoding(ByVal RetVal As Integer) _
Implements Encryption.FinishedDecoding
Function Encrypt(ByVal estring As String) _
As String Implements Encryption.Encrypt
' Place code to perform Xor encryption here.
End Function
Function Decrypt(ByVal dstring As String) _
As String Implements Encryption.Decrypt
' Place code to perform Xor decryption here.
End Function
Property EncryptionBits() As Integer _
Implements Encryption.EncryptionBits
Get
'Place code to return the value of this property here.
End Get
Set
'Place code to set this property here.
End Set
End Property
End Class注意 此演练使用简单的 Xor 加密来说明接口实现。但应使用更复杂的加密方式来存储敏感信息。
Visual Basic 语言参考
Interface 语句
声明接口的名称以及构成该接口的属性、方法和事件。
[ <attrlist> ] [ Public | Private | Protected | Friend | Protected Friend ] _
[ Shadows ] Interface name
[ Inherits interfacename[, interfacename ]]
[ [ Default ] Property proname ]
[ Function memberame ]
[ Sub memberame ]
[ Event memberame ]
End Interface各部分说明
attrlist
可选。应用于此接口的属性列表。多个属性以逗号分隔。
Public
可选。用 Public 修饰符声明的实体具有公共访问权限。对公共实体的使用没有限制。
Private
可选。用 Private 修饰符声明的实体具有私有访问权限。私有实体只在其声明上下文中是可访问的,包括任何嵌套实体。
Protected
可选。用 Protected 关键字声明的实体具有受保护的访问权限。仅可以从其自己的类或派生类中访问它们。只能对类成员指定受保护的访问。它不是友元访问的超集。
Friend
可选。用 Friend 修饰符声明的实体具有友元访问权限。具有友元访问权限的实体只有在包含此实体声明的程序内才是可访问的。默认情况下,没有指定访问修饰符的接口将声明为 Friend。
Protected Friend
可选。用 Protected Friend 修饰符声明的实体同时具有受保护访问权限和友元访问权限。
Shadows
可选。指示此接口隐藏基类中的同名编程元素。可以用其他任何类型的元素来隐藏任何类型的被声明元素。被隐藏的元素在隐藏它的派生类内不可用,除非隐藏元素不可访问,例如,如果它为 Private。
name
必选。该接口的名称;符合标准的变量命名规则。
Inherits
可选。指定所声明的接口从 interfacename 指定的接口继承属性和方法。
interfacename
如果存在可选的 Inherits 语句,则为必选项。指示一个或多个被继承的接口的名称。
Default
可选。指示与 Default 关键字关联的属性是接口的默认属性。
Property
可选。指示 Property 过程,该过程是接口的一个成员。
Function
可选。指示 Function 过程,该过程是接口的一个成员。
Sub
可选。指示 Sub 过程,该过程是接口的一个成员。
Event
可选。指示 Event 过程,该过程是接口的一个成员。
memberame
如果存在可选的 Property、Event、Function 或 Sub 语句,则为必选项。指示属性、过程或事件的名称。
End Interface
终止 Interface 块。
attrlist 部分中的每个属性具有以下语法和组成部分:
attrname [({ attrargs | attrinit })]attrlist 部分
attrname
必选。特性名。必须是有效的 Visual Basic 标识符。
attrargs
可选。该特性的定位参数列表。多个参数以逗号分隔。
attrinit
可选。该特性的字段或属性初始值设定项列表。多个初始值设定项以逗号分隔。
备注
接口的方法和属性在类中实现。若实现了方法,返回数据类型和参数数据类型必须完全匹配 Interface 块中对该方法的描述。但是,方法名不需要与 Interface 块中的描述相同。类中实现的方法不能被指定为 Shared 或 Private,除非在不可继承的类中。
Interface 语句可以出现在任何模块的声明部分。默认情况下,接口隐式声明为 Public,但可将其显式声明为 Public、Friend、Protected、Protected Friend 或 Private。
大多数情况下,接口可以有一个默认属性。这意味着,接口可以只继承一个包含默认属性的接口,或者它的定义块可以包含一个标记为默认属性的属性。
一个接口不能从另一个访问级限制比它高的接口继承。例如,公共接口不能继承友元接口。
接口实现示例
实现接口的类必须实现其所有的属性、方法和事件。
以下示例定义了两个接口。第二个接口 Interface2 对 Interface1 做了继承,且定义了一个附加属性和方法。
Interface Interface1
Sub sub1(ByVal i As Integer)
End Interface
Interface Interface2
Inherits Interface1 ' Demonstrates interface inheritance.
Sub M1(ByVal y As Integer)
ReadOnly Property Num() As Integer
End Interface下一个示例则实现上一示例中所定义的接口 Interface1:
Public Class ImplementationClass1
Implements Interface1
Sub Sub1(ByVal i As Integer) Implements Interface1.Sub1
' Place code here to implement this method.
End Sub
End Class最后一个示例则实现 Interface2,包括自 Interface1 继承的方法:
Public Class ImplementationClass2
Implements Interface2
Dim INum As Integer = 0
Sub sub1(ByVal i As Integer) Implements Interface2.Sub1
' Place code here that implements this method.
End Sub
Sub M1(ByVal x As Integer) Implements Interface2.M1
' Place code here to implement this method.
End Sub
ReadOnly Property Num() As Integer Implements _
Interface2.Num
Get
Num = INum
End Get
End Property
End ClassVisual Basic 语言概念
示例
本示例使用 Interface 语句定义一个 MyInterface 接口,该接口必须使用 Property 语句和 Function 语句来实现。
Public Interface MyInterface
Property MyProp(ByVal MyStr As String)
Function MyFunc(ByVal MyInt As Integer) As Integer
End Interface
相关URL: http://ruixuehongnian.spaces.live.com/blog/cns!77242AAFD522E39B!119.entry