Abstrakte Klassen konkret

von Thomas Bahn,
assono GmbH, Standort Kiel,


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.

Fachbeitrag Entwicklung

Sie haben Fragen zu diesem Artikel? Kontaktieren Sie uns gerne: blog@assono.de

Sie wollen eine individuelle Lösung? Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen? Wir sind für Sie da.

Wir verwenden Ihre Daten, um Sie einmalig per E-Mail zu kontaktieren. Wir geben Ihre Daten nicht an Dritte weiter. Siehe: Datenschutzhinweise
assono GmbH

Standort Kiel (Zentrale)
assono GmbH
Lise-Meitner-Straße 1–7
24223 Schwentinental

Standort Hamburg
assono GmbH
Bornkampsweg 58
22761 Hamburg

Telefonnummern:
Zentrale: +49 4307 900 407
Techn. Hotline: +49 4307 900 403
Vertrieb: +49 4307 900 402

E-Mail-Adressen:
kontakt@assono.de
bewerbung@assono.de