除了将属性和方法声明为 Public 和 Private 以外,也可以将它们声明为 Friend。Friend 成员对于工程中其它对象来说,看起来就象 Public 成员。也就是说,它们以类的接口部分的形式出现。但它们并不是类接口的一部分。
在用 Visual Basic 的专业版和企业版可以创建的 ActiveX 部件中,Friend 成员起了重要作用。因为它们并非某个对象的接口的一部分,所以不能被使用该部件对象的程序所访问。不过,对于该部件内所有其它对象来说,它们都是可见的,因此它们允许在该部件内进行安全的内部通信。
重点 因为 Friend 成员并非某个对象公用接口的一部分,它们不能被后期绑定访问—也就是说,通过 As Object 声明为对象的变量不能访问。为了使用 Friend 成员,必须用前期绑定声明的变量—也就是说,As classname。
“标准 EXE”工程不可能是 ActiveX 部件,因为它们的类模块不可能是 Public,所以不能被其它应用程序使用。因此在一个“标准 EXE”工程中,对象间所有通信都是私有的,并不需要 Friend 成员。
不过,Friend 成员有个特别有用的特点。因为它们不是某个 ActiveX 接口的一部分,它们不能用来在对象间传递用户定义类型。例如,在下面的标准模块中,假设有用户定义类型:
Public Type udtDemo
intA As Integer
lngB As Long
strC As String
End Type
可以在 Class1 中定义下面的私有变量和 Friend 成员:
Private mDemo As udtDemo Friend Property Get Demo() As udtDemo Demo = mDemo End Property '
注意udtDemo
必须通过引用来传递。Friend Property Let Demo(NewDemo As udtDemo)
mDemo = NewDemo
End Property
Friend Sub SetDemoParts(ByVal A As Integer, _
ByVal B As Long, ByVal C As String)
mDemo.intA = A
mDemo.lngB = B
mDemo.strC = C
End Sub
Public Sub ShowDemo()
MsgBox mDemo.intA & vbCrLf _
& mDemo.lngB & vbCrLf & mDemo.strC
End Sub
注意 当传递 Sub、Function,或属性过程参数这样的用户定义类型时,必须通过引用来传递它们。(ByRef 是过程参数的缺省值。)
然后可以写出下列代码使用 Class1:
Private Sub Command1_Click()
Dim c1A As New Class1
Dim c1B As New Class1
c1A.SetDemoParts 42, 1138, "Howdy"
c1B.Demo = c1A.Demo
c1B.ShowDemo
End Sub
信息框将显示 42、1138 和 "Howdy"。
注意 因为 Friend 过程并非类接口的一部分,所以当使用 Implements 语句来实现多接口时,它们并不包括在里面,如下面“多态”中所描述的。
详细信息 关于 Friend 成员在部件中的使用,在《部件工具指南》的“部件设计的一般准则”中的“对象之间的私有通信”中作了讨论。