Microsoft Office 2000/Visual Basic Programmer's Guide |
Fundamentally, implementing an interface requires two components. One component defines the interface, and the other implements it.
The component that defines the interface can come from a variety of places. It can be a class module in your project or in a referenced project. It can be a referenced component, such as a DLL. It can even be a built-in class. You can implement any interface contained in a type library, as long as that interface supports Automation. The component that implements the interface is a class module in a VBA project.
This section assumes that you're designing your own interface, and that you're creating it in a class module in the same VBA project that contains the classes in which you're implementing it. The examples shown here are designed in this way: One class module in the project defines the interface, and one or more class modules implement it.
Note that if the component that provides the interface is not part of your project, you must set a reference to its type library before you can implement it within a class in the project.
To notify VBA that you want to implement an interface, you use the Implements keyword, followed by the name of the interface (which is simply the name of the class that defines the interface). For example, the Library.xls sample file, found in the ODETools\V9\Samples\OPG\Samples\CH09 subfolder on the Office 2000 Developer CD-ROM, contains a class named LibraryItem, which defines the LibraryItem interface. To implement the LibraryItem interface in another class named Periodical, you would type the following line in the Declarations section of the Periodical class:
Implements LibraryItem
After you enter this line, when you click the Object drop-down list in the module's Code window, you'll see that LibraryItem appears in the list of available objects, and all the properties and methods defined for the interface appear in the Procedure drop-down list. For example, if the LibraryItem class includes a property named CheckedOut, the Property Let and Property Get procedures for the CheckedOut property appear in the list. When you select the Property Get procedure from the list, a procedure stub like the following one is added to the class module:
Private Property Get LibraryItem_CheckedOut() As Boolean
End Property
Note that the name of the interface you've implemented precedes the name of the property itself. Also note that the procedure stub created is denoted as private. This means that the LibraryItem_CheckedOut property does not form part of the Periodical object's own interface; it won't appear in the list of available properties for an object of type Periodical
. Instead, the CheckedOut property will appear in the list of available properties for an object of type LibraryItem
.
An important thing to understand when you implement an interface is that an interface is like a contract. When you implement an interface in a class module, you agree to include all of the interface's public members in the class module. Every procedure that appears in the Procedure list must be included in the class module before your project will compile, and each procedure must contain either code or a comment. For example, the LibraryItem interface has four read-write properties: Name, AllowCheckOut, ItemType, and CheckedOut. Each class that implements the LibraryItem interface must include the Property Let and Property Get procedures for each of these four properties.
Even if you don't need a particular procedure in your class module, you still have to include it in order to implement the interface. If you omit a procedure that's provided by the interface, the VBA project won't compile.
Only those members of the interface that are public are visible to the class module that's implementing the interface. In other words, only the public members of the interface are part of the contract, and only they can be implemented by other class modules. The class that describes the interface can include private members, but these members won't be part of the interface.