Visual Basic Concepts

Friend Properties and Methods

In addition to declaring properties and methods Public and Private, you can declare them Friend. Friend members look just like Public members to other objects in your project. That is, they appear to be part of a class's interface. They are not.

In the ActiveX components you can create with the Professional and Enterprise editions of Visual Basic, Friend members play an important role. Because they're not part of an object's interface, they can't be accessed by programs that use the component's objects. They're visible to all the other objects within the component, however, so they allow safe internal communication within the component.

Important   Because Friend members aren't part of an object's public interface, they can't be accessed late bound — that is, through variables declared As Object. To use Friend members, you must declare variables with early binding — that is, As classname.

Standard Exe projects can't be ActiveX components, because their class modules can't be Public, and thus can't be used by other applications. All communication between objects in a Standard Exe project is therefore private, and there's no need for Friend members.

However, Friend members have one particularly useful feature. Because they're not part of an ActiveX interface, they can be used to pass user-defined types between objects without exposing them publicly. For example, suppose you have the following user-defined type in a standard module:

Public Type udtDemo

   intA As Integer
   lngB As Long
   strC As String
End Type

You can define the following private variable and Friend members in Class1:

Private mDemo As udtDemo

Friend Property Get Demo() As udtDemo
   Demo = mDemo
End Property

' Note that udtDemo must be passed by reference.
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

Note   When you pass user-defined types as Sub, Function, or property procedure arguments, you must pass them by reference. (ByRef is the default for procedure arguments.)

You can then write the following code to use 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

The message box will display 42, 1138, and "Howdy."

Note   Because Friend procedures are not part of a class's interface, they are not included when you use the Implements statement to implement multiple interfaces, as described in "Polymorphism."

For More Information   The use of Friend members in components is discussed in "Private Communication Between Your Objects" in "General Principles of Component Design" in the Component Tools Guide.