Unterklassen
Eine Klasse kann in vielen formalen Sprachen als eine Unterklasse einer anderen Klasse gekennzeichnet werden. Damit wird festgelegt, daß die Unterklasse alle Operationen der Oberklasse implementiert. Das wird auch von der formalen Sprache sichergestellt, indem zunächst sämtliche Operationen der Operklasse automatisch von der Unterklasse übernommen werden.
Solch eine Kennzeichnung garantiert leider nicht, daß die Unterklasse auch ein semantischer Untertyp ihrer Oberklasse ist. Damit die Unterklasse auch ein semantischer Untertyp ist, müßte jedoch noch zusätzlich sichergestellt sein, daß die Operationen der Unterklasse auch die Spezifikation der Operationen der Oberklasse erfüllen. Das ist aber durch die meisten Sprachen nicht garantiert, weil Signaturen in einer Unterklasse auch anders implementiert werden können als in der Oberklasse und es dabei auch möglich ist, daß sie dann die Spezifikation der entsprechenden Signaturen der Oberklasse nicht mehr erfüllen. Ein Autor einer Unterklasse sollte aber das aber vermeiden.
Eine Unterklasse ist ein deklarierter Untertyp und ein formaler Untertyp. Sie sollte auch ein semantischer Untertyp sein.
Prorgrammiersprachen können zwar sicherstellen, daß eine Unterklasse ein formaler Untertyp ist, aber nicht, daß sie ein semantischer Untertyp ist. Deswegen muß der Autor einer Unterklasse selber darauf achten, daß dieses Kriterium erfüllt wird, also daß die Signaturen der Unterklasse auch die Spezifikationen der Oberklasse erfüllen.
Da eine Unterklasse ein Untertyp sein sollte und diese Regel auch meistens beachtet wird, kann im allgemeinen davon ausgegangen werden, daß dies so ist und es kann als eine Fehler angesehen werden, wenn es nicht beachtet wird. Die regelmäßige Beachtung dieser Empfehlung führt auch dazu, daß der Unterschied zwischen dem Begriffe „Unterklasse“ und dem Begriff „Untertyp“ nicht immer klar wird.
Eine Oberklasse wird auch als Basisklasse bezeichnet.
Um auszudrücken, daß B eine Unterklasse der Klasse A ist, kann man auch sagen, die Klasse B sei eine A -Klasse.
In UML gibt es einen speziellen Pfeil um eine Unterklassen -Beziehung zu kennzeichnen. Da diese bereits ausdrückt, daß die Unterklasse die Signaturen der Oberklasse enthält, müssen diese Signaturen dann nicht erneut in der Unterklasse angegeben werden.
Eine Klasse und eine Unterklasse [UML class diagram]
.------------------------.
| |
| Klasse |
| |
|------------------------|
|------------------------|
| + f( x : int ) : int |
'------------------------'
^
/_\
|
.------------------------.
| |
| Unterklasse |
| |
|------------------------|
|------------------------|
| + g( x : int ) : int |
'------------------------'
Die Unterklasse des dargestellten Klassendiagramms enthält also sowohl die Signatur "f( x : int ) : int" als auch die Signatur "g( x : int ) : int", obwohl das Rechteck der Unterklasse nur die zweite Signatur enthält.
Vererbung und Überschreiben
Die automatische Übernahme der Methoden einer Oberklasse in einer Unterklasse wird auch Vererbung (engl.: “inheritance ”) genannt. Man sagt auch, daß eine Unterklasse die Signaturen und die Implementationen ihrer Oberklasse erbt.
Wenn eine Unterklasse nur die ererbten Operationen ihrer Oberklasse enthielte, dann wäre sie immer semantisch. Sie kann jedoch einzelne Signaturen überschreiben, also das Verhalten der ererbten Signaturen neu festlegen. Diese Festlegung könnte so erfolgen, daß das Verhalten einer Signatur nicht mehr zu der Spezifikation der entsprechenden Operation der Oberklasse paßt. Dann ist die Unterklasse nicht mehr semantisch, was vermieden werden sollte. Es ist kein Mangel, eine ererbte Signatur zu überschreiben, aber dies sollte so geschehen, daß die Spezifikation der zugehörigen Operation der Oberklasse auch für das neu festgelegte Verhalten gilt.