Suppose you are the author of a Document class that specifies that Document objects can be stored in a database. You decide to have Document implement the IStorable interface. It isn't required that you do so, but by implementing the IStorable interface you signal to potential clients that the Document class can be used just like any other IStorable object. This will, for example, allow your clients to add your Document objects to a collection of IStorable objects, and to otherwise interact with your Document in this very general and well-understood way.
To implement the IStorable interface, you must do two things:
Declare a particular class that implements the interface, using the Implements keyword. The following code declares that the Document class implements IStorable:
Public Class Document
Implements IStorable
|
Implement each of the interface methods, events, properties, and so forth, and explicitly mark each member as implementing the corresponding interface member. The following code would implement the IStorable interface's Read( ) method:
Public Sub Read( ) Implements IStorable.Read
Console.WriteLine("Implementing the Read Method for IStorable")
End Sub 'Read
|
Visual Studio .NET will assist you in this effort through IntelliSense. When you enter the keyword Implements, IntelliSense prompts you with the various interfaces, as shown in Figure 8-1.
Once you enter the name of the interface, IntelliSense can help you identify which member you are implementing, as shown in Figure 8-2.
Your definition of this class might look like this:
Public Class Document : Implements IStorable Public Sub Read( ) Implements IStorable.Read '... End Sub 'Read Public Sub Write(ByVal o As Object) Implements IStorable.Write '... End Sub 'Write Public Property Status( ) As Integer Implements IStorable.Status '... End Property End Class 'Document
It is now your responsibility, as the author of the Document class, to provide a meaningful implementation of the IStorable methods and property. Having designated Document as implementing IStorable, you must implement all the IStorable members, or you will generate an error when you compile. Defining and implementing the IStorable interface is illustrated in Example 8-1.
Option Strict On
Imports System
Namespace InterfaceDemo
' define the interface
Interface IStorable
Sub Read( )
Sub Write(ByVal obj As Object)
Property Status( ) As Integer
End Interface 'IStorable
' create a class which implements the IStorable interface
Public Class Document
Implements IStorable
Public Sub New(ByVal s As String)
Console.WriteLine("Creating document with: {0}", s)
End Sub 'New
' implement the Read method
Public Sub Read( ) Implements IStorable.Read
Console.WriteLine("Implementing the Read Method for IStorable")
End Sub 'Read
' implement the Write method
Public Sub Write(ByVal o As Object) Implements IStorable.Write
Console.WriteLine( _
"Implementing the Write Method for IStorable")
End Sub 'Write
' implement the property
Public Property Status( ) As Integer Implements IStorable.Status
Get
Return myStatus
End Get
Set(ByVal Value As Integer)
myStatus = Value
End Set
End Property
' store the value for the property
Private myStatus As Integer = 0
End Class 'Document
Class Tester
Public Sub Run( )
Dim doc As New Document("Test Document")
doc.Status = -1
doc.Read( )
Console.WriteLine("Document Status: {0}", doc.Status)
End Sub 'Run
Public Shared Sub Main( )
Dim t As New Tester( )
t.Run( )
End Sub 'Main
End Class 'Tester
End Namespace 'InterfaceDemo
Output:
Creating document with: Test Document
Implementing the Read Method for IStorable
Document Status: -1
Example 8-1 defines a simple interface, IStorable, with two methods, Read( ) and Write( ), and a property, Status, of type Integer:
' define the interface
Interface IStorable
Sub Read( )
Sub Write(ByVal obj As Object)
Property Status( ) As Integer
End Interface 'IStorable
Notice that the IStorable method declarations for Read( ) and Write( ) do not include access modifiers, as was explained earlier, because interface methods are implicitly public so that they can be used by other classes. Once you've defined the IStorable interface, you can define classes that implement the interface. Keep in mind that you cannot create an instance of an interface; instead you instantiate a class that implements the interface.[1]
[1] As will be demonstrated later in this chapter, you can make variables of an interface type, but you must assign to those variables objects of the implementing type.
The class implementing the interface must fulfill the contract exactly and completely. Thus, your Document class must provide a Read( ) and a Write( ) method and the Status property.
' create a class which implements the IStorable interface
Public Class Document
Implements IStorable
Public Sub New(ByVal s As String)
Console.WriteLine("Creating document with: {0}", s)
End Sub 'New
' implement the Read method
Public Sub Read( ) Implements IStorable.Read
Console.WriteLine("Implementing the Read Method for IStorable")
End Sub 'Read
' implement the Write method
Public Sub Write(ByVal o As Object) Implements IStorable.Write
Console.WriteLine( _
"Implementing the Write Method for IStorable")
End Sub 'Write
' implement the property
Public Property Status( ) As Integer Implements IStorable.Status
Get
Return myStatus
End Get
Set(ByVal Value As Integer)
myStatus = Value
End Set
End Property
' store the value for the property
Private myStatus As Integer = 0
End Class 'Document
How the Document class fulfills the requirements of the interface, however, is entirely up to you as the class designer. Although IStorable dictates that Document must have a Status property, it does not know or care whether Document stores the actual status as a member variable or looks it up in a database. Example 8-1 implements the Status property by returning and setting the value of a private member variable, myStatus.
|
|
| Top |