Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

19.2 Privates, geschütztes und öffentliches Erben

19.2 Privates, geschütztes und öffentliches Erben

Als ich vorhin gesagt habe, dass man alle Attribute und Methoden der Basisklasse erbt, war dies nicht ganz die Wahrheit bzw. etwas unscharf formuliert, da es davon abhängt, wie man erbt. Am wenigsten Einschränkungen gibt es, wenn man "public" erbt. Dann stehen all die Attribute und Methoden zur Verfügung, welche in der Basisklasse "public" und "protected" sind. Alle anderen Sachen, welche "private" sind, werden verborgen, existieren aber noch im Hintergrund, denn wenn man eine Methode der Basisklasse aufruft, kann diese wiederum auf ihre privaten Attribute zugreifen. Man bekommt davon nur nichts mit, weil die privaten Attribute und Methoden in einer Art Blackbox versteckt sind.

Erbt man nun "privat", so ändert sich für die Klasse die erbt erst einmal nichts, aber von außen betrachtet wird schon einiges anders, da alle Attribute und Methoden der Basisklasse, auf einmal nicht mehr zur Verfügung stehen. Dies würde auch Klassen betreffen, die von der abgeleiteten Klasse abgeleitet sind. Ich habe diesen Fall nicht mit in das komplexe Beispiel eingebunden, aber ein möglicher Anwendungsfall wäre, dass man sich einen speziellen Container bauen möchte, welcher irgendwelche Elemente aufnehmen soll. Dazu erbt man am Besten von der Klasse "CList" ab, da man dann schon alle Funktionalitäten besitzt, welche zur Verwaltung von Listen notwendig sind. Nun möchte man aber nicht alle diese geerbten Methoden nach außen tragen, weil man kontrollieren will, was z.B. hinzugefügt oder entfernt wird. Um dies zu erreichen, würde man "privat" erben und entsprechende öffentliche Methoden bauen, die die gewünschten Überprüfungen durchführen und ggf. die Aktionen abblocken.

Ähnlich ist es, wenn man "protected" erbt, nur dass dann die öffentlichen Attribute und Methoden "protected" werden. Das hat zur Folge, dass sie zwar auch von außen nicht mehr zur Verfügung stehen, jedoch haben abgeleitete Klassen noch Zugriff. In folgender Grafik habe ich dies versucht zu visualisieren.

Öffentliches, geschütztes und privates Erben

Wie man sehen kann, verändert sich die Sichtbarkeit der Methoden in den abgeleiteten Klassen und in den vavon abgeleiteten Klassen, findet wiederum eine Veränderung statt. In meinem komplexen Beispiel bin ich aber auch auf diese Art der Vererbung nicht eingegangen, da man diese vielen Varianten nur sehr selten braucht und es immer schwer ist, entsprechende sinnvolle Fälle zu konstruieren. Ich werde also immer nur öffentlich erben.

Kommen wir aber nun wieder zurück zum eigentlichen Thema. Dort sehen Sie nun, dass z.B. die Klasse "CHarleyDavidson" von der Klasse "CMotorrad" abgeleitet ist, welche wiederum von der Klasse "CFahrzeug" erbt. Die Ableitungen sind öffentlich (was man dem UML-Klassendiagramm leider nicht entnehmen kann). Im folgenden Quelltextausschnitt sehen Sie, wie dies aussehen könnte.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
					
class CFahrzeug {
	//...
};

class CMotorrad : public CFahrzeug {
	//...
};
						
class CHarleyDavidson : public CMotorrad {
	// ...
};
					

Vererbungspfad für die Klasse CHarleyDavidson

Die Klasse "CHarleyDavidson" besitzt jetzt also nicht nur einen Kickstarter, sondern auch einen Lenker, eine Kette sowie eine Farbe und eine Geschwindigkeit, nur mit dem feinen Unterschied, dass sie selbst an Kette, Lenker, Farbe und Geschwindigkeit nicht herankommt, da sie in den Basisklassen "CMotorrad" und "CFahrzeug" als privat deklariert sind. Dies wird auch an dem Minus im UML-Klassendiagramm kenntlich gemacht. Die Basisklassen müsste also noch entsprechende Getter bzw. Setter zur Verfügung stellen, damit der Zugriff möglich ist.

Auffällig ist auch, dass "CHarleyDavidson" nur von "CMotorrad" erben muss. Das zusätzliche Enthalten der Attribute und Methoden der Klasse "CFahrzeug" ist automatisch dadurch gegeben, dass "CMotorrad" von "CFahrzeug" erbt. Man hat also eine Vererbungshierarchie und die geerbten Sachen werden an alle abgeleiteten Klassen weiter vererbt, welche jene an weiter vererbte Klassen weiterreichen. Für dieses Beispiel bedeutet dies, dass ich in den entsprechenden Auto - und Motorradklassen Implementierungsaufwand spare. Gerade wenn ich zehn weitere Motorräder und zwanzig weitere Autotypen benötigen würde, spare ich enorm viel redundanten Quelltext.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012