Abstrakte Klassen konkret

von Thomas, assono GmbH, Standort Kiel, 18.12.2009


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.

Thomas Bahn

Thomas Bahn

Diplom-Mathematiker, IT-Spezialist & Speaker auf Fachkonferenzen

Thomas Bahn ist Mitgründer und Geschäftsführer der assono GmbH. Seit mehr als 20 Jahren berät er erfolgreich Unternehmen aus ganz Deutschland rund um das Thema Software und Digitalisierung. Insbesondere in den Bereichen HCL Notes und Domino (ehemals IBM) als auch bei aktuellen, unternehmensrelevanten KI-Themen wie Chatbots kennt er die neusten Entwicklungen und weiß, wie diese sich gewinnbringend für Unternehmen einsetzen lassen. Aufgrund seines Expertenwissens ist Thomas Bahn regelmäßiger Sprecher auf nationalen und internationalen Fachkonferenzen.

Fachbeitrag Entwicklung

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

Sie haben Interesse an diesem Thema?

Gerne bieten wir Ihnen eine individuelle Beratung oder einen Workshop an.

Kontaktieren Sie uns

Weitere interessante Artikel