Nach dieser Lektion kannst du
Bisher haben wir unsere Klassen immer weiter verbessert. Zunächst haben wir Klassen durch Abstraktion erstellt. Anschließend haben wir mit der Vererbung Gemeinsamkeiten in Oberklassen ausgelagert.
Nun stellt sich jedoch eine neue Frage: Soll wirklich jeder beliebige Programmteil auf alle Daten einer Klasse zugreifen dürfen? Die Antwort lautet meistens: Nein. Genau darum geht es bei der Kapselung.
Kapselung bedeutet, dass eine Klasse selbst entscheidet, welche Informationen von außen sichtbar sind und welche verborgen bleiben.
Man kann sich eine Klasse wie eine Maschine vorstellen. Dadurch werden Daten geschützt und Änderungen können nur über genau definierte Schnittstellen erfolgen.
In UML wird die Sichtbarkeit von Attributen und Methoden direkt im Klassendiagramm dargestellt. Dafür werden kleine Symbole vor den Namen verwendet.
| Symbol | Bedeutung |
|---|---|
| + | public – von überall zugreifbar |
| # | protected – innerhalb der Klasse und ihrer Unterklassen zugreifbar |
| – | private – nur innerhalb der eigenen Klasse zugreifbar |
Es existieren noch weitere Sichtbarkeiten, beispielsweise package (~). Für die meisten Klassendiagramme und auch für die IHK-Prüfung spielen jedoch hauptsächlich diese drei eine Rolle.
Wir greifen wieder auf unser bisheriges Klassendiagramm zurück und ergänzen es um Sichtbarkeiten.
Schauen wir uns die einzelnen Elemente genauer an.
Die Attribute des Hundes beginnen mit einem Minuszeichen: - farbe, - rasse, - besitzer. Das bedeutet: Diese Eigenschaften dürfen nur innerhalb der Klasse Hund direkt verändert werden. Von außen kann niemand einfach den Besitzer oder die Rasse überschreiben. Das schützt die Daten vor unbeabsichtigten Änderungen.
Die Methoden besitzen dagegen ein Pluszeichen, zum Beispiel + bellt(). Methoden bilden die Schnittstelle einer Klasse. Über sie darf mit einem Objekt gearbeitet werden. Andere Klassen können also beispielsweise die Methode bellt() aufrufen.
Manchmal sollen Attribute zwar nicht öffentlich sein, aber trotzdem von Unterklassen verwendet werden können. Dafür gibt es die Sichtbarkeit protected. In unserem Beispiel besitzt die Klasse Säugetier das Attribut # alter. Die Klasse Hund erbt dieses Attribut und darf darauf zugreifen. Andere Klassen außerhalb dieser Vererbungshierarchie dagegen nicht. Protected bildet also einen Mittelweg zwischen public und private.
In der Praxis gilt für UML und viele objektorientierte Programmiersprachen eine einfache Faustregel:
Warum? Attribute enthalten die eigentlichen Daten eines Objekts. Diese sollen möglichst geschützt werden. Methoden dagegen stellen die Funktionen bereit, mit denen andere Klassen arbeiten dürfen. Nur wenn Attribute bewusst von Unterklassen verwendet werden sollen, werden sie häufig als protected modelliert.
Gerade in IHK-Prüfungen gilt: Wenn keine Sichtbarkeit angegeben ist, werden Attribute als private und Methoden als public angenommen. Wer das nicht weiß, interpretiert ein Diagramm ohne Symbole schnell falsch.
Die Zugriffsmodifikatoren sind kein Selbstzweck. Sie lösen ganz konkrete Probleme.
Stell dir eine Klasse Auto vor. Sie besitzt das Attribut tankfuellung, darin steht beispielsweise 20,0 Liter.
Wäre dieses Attribut öffentlich, könnte jede beliebige Klasse einfach schreiben: tankfuellung = 80. Das wäre natürlich unrealistisch – ein Auto bekommt schließlich nicht plötzlich mehr Benzin, nur weil jemand den Wert verändert.
Stattdessen bleibt das Attribut private. Die Klasse stellt dafür Methoden bereit: - tankfuellung, + tanken(), + fahren(). Die Methode tanken() erhöht die Tankfüllung, fahren() reduziert sie. Andere Klassen dürfen also nicht direkt den Wert verändern, sondern nur diese definierten Schnittstellen verwenden.
Ein noch wichtigeres Beispiel ist ein Bankkonto. Ein Konto besitzt beispielsweise das Attribut kontostand. Natürlich wäre es fatal, wenn jede beliebige Person auf einer Website diesen Wert einfach ändern oder auslesen könnte.
Deshalb bleibt auch dieser Wert private. Der Zugriff erfolgt ausschließlich über Methoden: - kontostand, + anmelden(), + kontostandAnzeigen(), + einzahlen(), + auszahlen().
Bevor der Kontostand angezeigt wird, kann die Methode zunächst prüfen, ob der Benutzer überhaupt angemeldet und berechtigt ist. Die eigentlichen Daten bleiben geschützt.
Genau deshalb spricht man bei Methoden häufig auch von einer Schnittstelle zwischen einer Klasse und ihrer Umgebung.
- steht für private und wird meist für Attribute verwendet.+ steht für public und wird meist für Methoden verwendet.# steht für protected und erlaubt den Zugriff innerhalb einer Vererbungshierarchie.In der nächsten Lektion lernen wir mit der Polymorphie das vierte Grundkonzept der Objektorientierung kennen. Dabei werden wir sehen, dass geerbte Methoden nicht nur übernommen, sondern bei Bedarf auch an die jeweilige Unterklasse angepasst werden können.