Grundkonstrukte der Objektorientierung in Java, C# und C++ 2 Viele Patterns basieren auf einer Kombination einiger zentraler Modellierungskonstrukte, namentlich auf Schnittstellen- und Implementierungsvererbung sowie abstrakten und konkreten Klassen. In diesem Abschnitt zeigen wir Ihnen zu diesen Konstrukten einige Möglichkeiten zur Implementierung in den Sprachen Java, C# und C++ auf. Die kleine, aber feine Smalltalk-Gemeinde möge uns diese Auswahl verzeihen die normative Kraft des Faktischen siegt eben häufig über den Sachverstand. 2.1 Vererbung Java und C# unterstützen einfache Implementierungsvererbung, aber mehrfache Schnittstellenvererbung. Java kennzeichnet Schnittstellenvererbung durch das Schlüsselwort implements, Implementierungsvererbung durch extends. C++ unterstützt echte Mehrfachvererbung. 2.2 Abstrakte Klassen Von abstrakten Klassen können niemals Instanzen erzeugt werden. Sie dienen dazu, ihren Unterklassen sowohl Schnittstellen als auch Implementierung vorzugeben. K. Eilebrecht, G. Starke, Patterns kompakt, IT kompakt, DOI 10.1007/978-3-642-34718-4_2, Springer-Verlag Berlin Heidelberg 2013 19
20 2 Grundkonstrukte der Objektorientierung in Java, C# und C++ Java und C# kennen abstrakte Klassen, gekennzeichnet durch den abstract-modifier. C++ kennzeichnet abstrakte Klassen durch pure virtual methods. Genauer: Der Zweck von pure virtual methods ist es, dass abgeleitete Klassen ausschließlich die Schnittstelle dieser Methoden erben (und die erste nicht abstrakte Unterklasse sie zwangsläufig implementieren muss). 2.3 Beispiel: Ein Modell von Fahrzeugen Wir verwenden an dieser Stelle ein einfaches Beispiel, um Ihnen die Umsetzbarkeit der Konstrukte in den drei Programmiersprachen zu zeigen (siehe Abb. 2.1). Sie sind an dieser Stelle herzlich eingeladen, die Abstraktionen unseres Beispiels kritisch zu betrachten und das Design zu verbessern (denken Sie etwa an Amphibienfahrzeuge). Nachfolgend finden Sie exemplarische Code-Fragmente, um die in der Abbildung gezeigten Elemente Fahrzeug, Wasserfahrzeug und Fischerboot in verschiedenen Programmiersprachen zu implementieren. Unabhängig von den üblichen Programmierkonventionen für einzelne Programmiersprachen orientieren wir uns bei der Namensgebung im Code an unserem Modell. Beispielcode in Java public interface Fahrzeug { void fahren(); float getgewicht(); public abstract class Wasserfahrzeug implements Fahrzeug { public abstract float geteigengewicht(); public abstract float getzuladung(); public float getgewicht() { return (geteigengewicht()+getzuladung());
2.3 Beispiel: Ein Modell von Fahrzeugen 21 <<interface>> AnkerSupport ankerlichten() ankerwerfen() <<interface>> Fahrzeug fahren() getgewicht() <<abstract >> Wasserfahrzeug getgewicht() getzuladung() geteigengewicht() Fischerboot fahren() getzuladung() ankerlichten() fahren() Tretroller Abb. 2.1 Modell einer Ableitungshierarchie public class Fischerboot extends Wasserfahrzeug implements AnkerSupport { public float geteigengewicht() { return eigengewicht; public float getzuladung() { return zuladung; public void fahren() {
22 2 Grundkonstrukte der Objektorientierung in Java, C# und C++ public void ankerlichten() { Beispielcode in C++ Datei fahrzeug.h: class Fahrzeug { public: virtual void fahren (void) = 0; virtual float getgewicht(void) = 0; ; Datei wasserfahrzeug.h: #include <fahrzeug.h> class Wasserfahrzeug : public Fahrzeug { public: virtual float getgewicht(void); virtual float geteigengewicht(void) = 0; virtual float getzuladung(void) = 0; ; Datei fischerboot.h #include <wasserfahrzeug.h> class Fischerboot : public Wasserfahrzeug { public: void fahren(void); void ankerlichten(void); virtual float getzuladung(void); virtual float geteigengewicht(void); ; Datei fischerboot.cpp #include "fischerboot.h" void Fischerboot::fahren(void) { void Fischerboot::ankerLichten(void) {
2.3 Beispiel: Ein Modell von Fahrzeugen 23 float Fischerboot::getZuladung() { return zuladung; float Fischerboot::getEigengewicht() { return eigengewicht; Datei wasserfahrzeug.cpp #include "wasserfahrzeug.h" float Wasserfahrzeug::getGewicht(void) { return(geteigengewicht()+getzuladung()); ; Beispielcode in C# public interface Fahrzeug { void fahren(); float getgewicht(); public abstract class Wasserfahrzeug : Fahrzeug { public abstract void fahren(); public abstract float geteigengewicht(); public abstract float getzuladung(); public float getgewicht() { return (geteigengewicht()+getzuladung()); public class Fischerboot : Wasserfahrzeug, AnkerSupport { public float geteigengewicht() { return eigengewicht; public float getzuladung() { return zuladung; public override void fahren() {
24 2 Grundkonstrukte der Objektorientierung in Java, C# und C++ public void ankerlichten() {
http://www.springer.com/978-3-642-34717-7