Das unter objektorientierten Menschen so beliebte
,,information hiding``
ist in C++ ähnlich umgesetzt wie in anderen objektorientierten
Sprachen auch: man deklariert Teile einer Klasse als public,
protected und private (und -anders als in Java- auch
entsprechend, von welchen Klassen man ableitet). Damit gibt der
Ersteller einer klasse vor, was nur in der Klasse benutzt werden darf
und was der Benutzer beim Ableiten oder Instanziieren verwenden
darf. Eine so erteilte Zugriffsbeschränkung wird zwar als information hiding bezeichnet, ist aber in Wirklichkeit gar kein
Verstecken von Informationen: der Benutzer hat ja offensichtlich
Lesezugriff auf die von ihm mit #include
eingebundenen
Headerdateien, in denen die private- und protected-Elemente der Klasse ja alle aufgeführt sind.
Auch wenn die so realisierte Zugriffsbeschränkung hinreichend ist, um sauberes Programmieren zu fördern, ist es gelegentlich noch nicht ausreichend.
Beispielsweise möchte ein Anbieter einer kommerziellen Bibliothek, der viel Entwicklungsaufwand in das Design steckte, sicher nicht seinen Konkurrenten die Arbeit beim Nachbau erleichtern, indem er alle Datenelemente und intern verwendeten Methoden in der Headerdatei auflistet; am besten noch gut kommentiert.
Die Definition der Methoden (also der wirklich ausgeführte Code) ist recht leicht vor dem Benutzer zu verstecken, indem in der Klasse nur die Deklarationen aufgeführt werden, und die Definitionen dagegen außerhalb der Klasse in einem eigenen Quelltext. Letzterer wird für das jeweilige Zielsystem kompiliert und dem Anwender nur als Objektdatei ausgeliefert.
Aber auch die Deklaration der Methoden und der Datenelemente ist bereits recht informativ.
Was der Anwender wirklich braucht, ist ja nur der öffentliche Teil (public) der Schnittstelle (und falls er Ableitungen der Klasse erstellen soll, auch noch den protected-Teil, was im folgenden aber ignoriert wird; es ist analog zu behandeln).
Um jetzt alles zu verbergen, was der Benutzer nicht unbedingt braucht, gibt es einen Mechanismus, der gelegentlich als Cheshire Cats bezeichnet wird:
Der Ersteller einer Klasse (beispielsweise A
) baut in Wirklichkeit zwei Klassen:
A_intern
mit der vollen Funktionalität in einem
eigenen Quelltext A_intern.cpp und einer eigenen Deklarationsdatei
A_intern.h. Diese Klasse wird dem Anwender nur kompiliert zur
Verfügung gestellt; weder der Quelltext A_intern.cpp noch die
Deklarationen in A_intern.h werden aus der Hand gegeben.
Letztere wird dem Benutzer zur Verfügung gestellt, und enthält ausschließlich öffentliche Elemente und Methoden (oder auch protected, falls der Anwender ableiten darf). Zudem ist in der Klasse eine Referenz auf ein Element der geheimen Klasse A eingefügt, und im Konstruktor wird ein solches Element allokiert und im Destruktor wieder freigegeben. Dazu muß der Compiler beim Übersetzen der Anwenderprogramme nicht mehr wissen, als daß es eine Klasse mit dem Namen A_intern gibt.
Die Implementation der Klasse A in der Datei A.cpp wird dem Anwender nicht im Quelltext zur Verfügung gestellt, sondern ebenfalls nur als kompilierte Objektdatei.
Neben dem beschriebenen Allokieren und Freigeben des Elements der Klasse A_intern (was sowohl in der Headerdatei als auch in der Definitionsdatei erfolgen kann) enthält diese Klasse nur alle öffentlichen Methoden aus der geheim zu haltenden internen Klasse. Diese Methoden rufen jeweils nur die gleichnamige Methode aus der internen Klasse auf und reichen dabei ihre Parameter und die Funktionsergebnisse durch.
Was der Anwender also bekommt, ist nur noch eine Headerdatei A.h mit dem öffentlichen Teil (für den Compiler ebenso wie als Dokumentation, soweit diese nicht extern erfolgt), sowie die Kompilate der beiden Klassen.
Zum Begriff ,,Cheshire Cats`` habe ich zwei Stellen im Internet gefunden, mit denen die Herkunft aber auch nicht so recht klar wird:
Carroll may have seen these cheeses, but he may have taken his reference from an even earlier source. The Cheshire cheesemakers saw fit to add a grinning cat to their product because it was an abbreviation of ¨grin like a Cheshire Caterling¨, which was current about five centuries ago. Caterling was a lethal swordsman in the time of Richard III, a protector of the Royal Forests who was renowned for his evil grin, a grin that became even broader when he was despatching a poacher with his trusty sword. Caterling soon became shortened to ¨Cat¨ and anyone adopting a particularly wicked grin was said to be ¨grinning like a Cheshire Cat.¨ Carroll probably knew of this phrase, but because he refers to the grin outlasting the rest of body, it is more than likely his real influence was the cheese rather than the swordsman.
In reality, the true origin of the saying is much older; it was merely borrowed and made famous by him.
An old simile popularized by Lewis Carroll:
¨please would you tell me,¨ said Alice a little timidly,... ¨why your cat grins like that?¨ ¨It's a Cheshire cat,¨ said the Duchess, ¨and that's why.¨ Alice in Wonderland, (1865), ch. vi.
The phrase has never been satisfactorily explained, but it has been said that Cheshire cheese was once sold moulded like a cat that appeared to be grinning. The waggish explanation is that the cats know that Cheshire is a county palatine [properly the dominion of an earl palatine over which he had quasi-royal jurisdiction] and find the idea a source of amusement. (source: Brewer´s Dictionary of Phrase and Fable)
AnyWare@Wachtler.de