Wir sind seit vielen Jahren aktive Verfechter für und Nutzer von objekt-orientierter
Programmierung (OOP) mit LotusScript. Leider hat die Sprache an sich einige
Defizite gegenüber moderneren Vertretern ihrer Art, wie zum Beispiel das
Fehlen von Mehrfachvererbung oder zumindest Interfaces. Ein weiterer Punkt
ist, dass man Methoden nicht überladen kann, also nicht mehrere Methoden
erstellen kann, die den gleichen Namen haben und sich nur in der Anzahl
und Art ihrer Parameter unterscheiden (Parametersignatur). Bei normalen
Methoden kann man natürlich noch darauf ausweichen, dass man einfach unterschiedliche
Namen vergibt, aber der Konstruktor muss immer Public
Sub
New
heißen.
Eine Möglichkeit, den Konstruktor flexibler
zu gestalten, ist es, ihm eine Liste zu übergeben, die den oder die Parameter
enthält.
Aber gerade, wenn es um genau einen
Parameter geht, ist der Weg mit der Liste mit viel Overhead verbunden.
Eine einfache, elegante Möglichkeit ist es dann, ein Variant und eine "Objektweiche"
zu benutzen.
Als Beispiel dient der Konstruktur einer
Klasse OpenGeoDBRecord. Die Objekte dieser Klasse sollen entweder mit einer
Liste, einem Array, einem NotesDocument- oder einem NotesViewEntry-Objekt
initialisiert werden können (oder "nackt" mit Vorgabewerten):
Private Class OpenGeoDBRecord
Public Sub New(source As Variant)
Dim openGeoDoc As NotesDocument
Dim openGeoEntry As NotesViewEntry
If TypeName(source) = "VARIANT LIST" Then
Call ReadFromList(source)
ElseIf TypeName(source) = "STRING( )" Then
Call ReadFromArray(source)
ElseIf source Is Nothing Then
' initialize with default values...
ElseIf source IsA "NotesDocument" Then
Set openGeoDoc = source
Call ReadFromDoc(openGeoDoc)
ElseIf source IsA "NotesViewEntry" Then
Set openGeoEntry = source
Call ReadFromViewEntry(openGeoEntry)
End If
End Sub
Public Sub ReadFromList(paramList As Variant)
'/**
' * reads data from a list with the parameter names as keys.
' *
' * @param paramList Variant list of parameters with parameter names as keys.
' */
End Sub
Public Sub ReadFromArray(paramArray As Variant)
'/**
' * reads data from an array
' *
' * @param paramArray String array of parameters.
' */
End Sub
Public Sub ReadFromDoc(openGeoDoc As NotesDocument)
'/**
' * reads data from a document
' *
' * @param openGeoDoc NotesDocument object to read from.
' */
End Sub
Public Sub ReadFromViewEntry(openGeoEntry As NotesViewEntry)
'/**
' * reads data from a view entry (more efficient than from a NotesDocument)
' *
' * @param openGeoDoc NotesViewEntry object to read from.
' */
End Sub
End Class
Man beachte auch den "Cast" über die getypten Variablen.
Statt des IsA-Operators kann man natürlich auch TypeName(source) = "NOTESDOCUMENT"
bzw. TypeName(source) = "NOTESVIEWENTRY"
verwenden.