Wenn du andere objekt-orientierte Programmiersprachen,
wie z. B. Java, kennst, dann schätzt du wahrscheinlich auch abstrakte
Klassen. Diese Klassen kann man nicht direkt instanziieren, also keine
Objekte aus ihnen erstellen. Aber man kann andere Klassen davon ableiten,
die man ganz normal instanziieren kann. In einer abstrakten Klasse kann
man Attribute und Methoden haben wie in jeder anderen Klasse auch.
Normalerweise modellieren abstrakte
Klasses ein Konzept oder eine Abstraktion, z. B. Tier. Es gibt Hunde und
Katzen, aber kein Lebewesen ist nur ein Tier, es ist immer eine bestimmte,
konkrete Art von Tier.
In der abstrakten Klasse Tier kann man
all die Attribute und Methoden definierien, die alle Tiere gemeinsam haben.
Dann kann man Unterklassen wie Hund oder Katze erstellen, die neue Mitglieder
hinzufügen oder vererbte überschreiben.
Andere Klasses sind abstrakt, weil sie
Methoden enthalten, die auf diesem Level nicht implementiert werden können.
Nur die konkreten Unterklassen "wissen", wie eine solche Methode
realisiert werden soll.
Ein typisches Beispiel wäre eine generische
Klasse Sorter mit der abstrakten Methode Sortiere. In den konkreten Unterklassen
BubbleSorter, HeapSorter and QuickSorter wird die Sortiere-Methode
unterschiedlich überschrieben.
Unglücklicherweise gibt es in LotusScript
keine abstrakten Klassen. Aber es gibt einen Weg, sie zu "simulieren":
Class
AbstractClass
Public
Sub New()
If TypeName(Me) =
UCase("AbstractClass") Then
Error
1, |Abstract class: ? | & TypeName(Me)
End If
End
Sub ' AbstractClass.New
Public
Sub Method()
Error 2, |Abstract
method: ...|
End
Sub ' AbstractClass.Method
End Class
Class ConcreteSubclass
As AbstractClass
Public
Sub New()
' might be empty or not...
End
Sub ' ConcreteSubclass.New
Public
Sub Method()
' the implementation...
End
Sub ' ConcreteSubclass.Method
End Class '
ConcreteSubclass
Achtung: Der Klassenname im String
in der If-Anweisung in der New-Methode der abstrakten Klasse muss mit dem
Namen der Klasse übereinstimmen.
Man kann jetzt zwar ein Objekt von AbstractClass
erstellen - der LotusScript-Compiler erzeugt keine Warnung wie in Java
- aber wenn der Code ausgeführt wird, wird ein Fehler generiert.
Wenn man dann eine Unterklasse wie ConcreteSubclass
erstellt, stimmt TypeName(Me) nicht mehr mit UCase("AbstractClass")
überein und der New-Konstruktor läuft erfolgreich durch, das Objekt wird
erstellt.
Wenn die abstrakte Methode Method nicht
von einer Unterklasse überschrieben würde, würde bei einem Aufruf die geerbte
Methode der Oberklasse ausgeführt und ein entsprechender Fehler geworfen.