Vererbung, Zugriffsrechte, Freunde
-
Hi!
Folgendes läßt mir keine Ruhe:
Man stelle sich vor man hat zwei Klassen. Eintrag und Verwalter. Beide sind dazu gedacht, abgeleitet zu werden. "Eintrag" verleiht seinen Erben die Fähigkeit, durch "Verwalter" verwaltet werden zu können. Beide haben einige virtuelle Methoden, die beim Ableiten implementiert werden müssen.
Die meißten Member von "Eintrag" sind protected, die von "Verwalter auch". Darüber hinaus greift "Verwalter" massiv auf sämtliche Member von "Eintrag" zu. Darum ist "Verwalter" ein friend von "Eintrag". leider ist es damit aber noch nicht getan. Ich erinnere an die virtuellen Funktionen. Es ist nämlich nötig, daß auch alle *Erben* von "Verwalter" vollen Zugriff auf "Eintrag" haben.
Ich möchte erreichen, daß die Zugriffsrechte in "Eintrag" trotzdem möglichst eingeschränkt sind. Denn eigentlich muß niemand, außer dem "Verwalter" und seinen Erben, Zugriff auf "Eintrag" haben (ausgenommen öffentlicher Konstrukor und Desktruktor).
Das Beste wäre also, wenn "Verwalter" und *alle seine Erben* friends von "Eintrag" wären. Läßt sich soetwas in C++ formulieren? Meines Wissens nach nicht.
Einzige Möglichkeit, die ich gefunden habe, wäre, alle Member von "Eintrag" komplett public statt protected zu machen (kotz) oder alle Erben von "Verwalter" nachträglich als friend in "Eintrag" zu vermerken (was aber nicht möglich ist, weil die beiden Klassen Teil eines quasi unveränderlichen Frameworks sind).
Gibts für sowas eine vernünftige Lösung?
-
freundschaft vererbt sich nicht.
ich mag auch die freunde von meiner mama nicht alle.aber ich kann meinen mama immer fragen "sag mir doch mal, was der herr huber so verdient". und natürlich ist diese fragestellung protected, also mir sagt die mama das, aber nicht dem briefträger, wenn er die gleiche frage stellt.
vielleicht kannste ja ähnlich vorgehen und in der basisklasse Verwalter static protected methoden anbieten, wie static protected string const& getEintragName(Eintrag const& e){return e.name;}?
-
volkard schrieb:
freundschaft vererbt sich nicht.
ich mag auch die freunde von meiner mama nicht alle.aber ich kann meinen mama immer fragen "sag mir doch mal, was der herr huber so verdient". und natürlich ist diese fragestellung protected, also mir sagt die mama das, aber nicht dem briefträger, wenn er die gleiche frage stellt.
vielleicht kannste ja ähnlich vorgehen und in der basisklasse Verwalter static protected methoden anbieten, wie static protected string const& getEintragName(Eintrag const& e){return e.name;}?
Nein, mit static klappt das nicht. Aber ich habe inzwischen eine andere Methode gefunden. Ich habe Verwalter so gestaltet, daß er bis auf Weiteres nicht abgeleitet werden muss, um seine Funktion zu erfüllen. Eintrag ist komplett protected und Verwalter ist friend von Eintrag. Dadurch reicht die Virtualität des Großteils aller Eintrag Methoden aus. Ich habe im Prinzip die gesamte virtualität und Flexibilität in Eintrag verlagert, wodurch Verwalter nicht mehr abgeleitet werden muss (hoffe ich zumindest). Das ganze macht jetzt einen viel besseren Eindruck als zuvor, weil Verwalter jetzt viel universeller ist. Das Opfer ist halt, daß Eintrag jetzt mehr virtuelle Methoden besitzt, als vorher.