友元属性和方法

除了将属性和方法声明为 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 成员在部件中的使用,在《部件工具指南》的“部件设计的一般准则”中的“对象之间的私有通信”中作了讨论。