Hallo zusammen,
ich stolpere gerade über etwas, das mich schon mal gezwickt hat:
Wenn ich eine Basisklasse habe und die Basisklasse public vererbe,
warum sind Felder der Basisklasse trotzdem für die abgeleitete Klasse
nicht erreichbar?
Was ist der Nutzen davon?
Milhouse van Hauten schrieb:> Hallo zusammen,>> ich stolpere gerade über etwas, das mich schon mal gezwickt hat:>> Wenn ich eine Basisklasse habe und die Basisklasse public vererbe,> warum sind Felder der Basisklasse trotzdem für die abgeleitete Klasse> nicht erreichbar?
Was in der Basisklasse private ist, ist nur von dort aus nutzbar und von
nirgends anders, PUNKT. Wie du ableitest, spielt dabei keine Rolle.
> Was ist der Nutzen davon?
Der Nutzen von private ist, dafür zu sorgen, dass auf interne Daten nur
auf kontrolliertem Weg zugegriffen werden kann.
Es machte mich deshalb stuzig, weil eine Ableitung eine
"Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse
eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen
Felder" nicht zugreifen zu können.
Wenn ich in einer Basisklasse eine public int amlege und die Basisklasse
mit public an eine andere Klasse vererbe, ist diese int dann auch in der
abgeleiteten Klasse public?
Milhouse van Hauten schrieb:> Es machte mich deshalb stuzig, weil eine Ableitung eine> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen> Felder" nicht zugreifen zu können.
Und unter Java hättest du damit recht, imho.
Tatsächlich kenn ich spontan mehrere Beispiele von Leuten, die über das
selbe Problem gestolpert sind.
Anscheinend finden also viele diese Lösung nicht intuitiv.
C++ hat sich an der Stelle halt entschieden, ein wenig restriktiver zu
sein.
Sollte man verbuchen unter "ist halt so, merk ich mir, problem solved".
Le X. schrieb:> Milhouse van Hauten schrieb:>> Es machte mich deshalb stuzig, weil eine Ableitung eine>> "Ist-Ein-Beziehung" ist.
Wenn du damit auf das Thema Polymorphie anspielen willst:
Hierfür ist lediglich die public-Schnittstelle entscheidend.
> Und unter Java hättest du damit recht, imho.
Nein, protected vs. private verhält sich unter Java exakt genau so wie
unter C++.
In Smalltalk hingegen ist private sogar noch restriktiver, dort können
selbst Objekte der gleichen Klasse nicht auf die privaten Teile ihrer
"Geschwister"-Objekte zugreifen.
> Tatsächlich kenn ich spontan mehrere Beispiele von Leuten, die über das> selbe Problem gestolpert sind.> Anscheinend finden also viele diese Lösung nicht intuitiv.
Intuition ist an der Stelle auch nicht wirklich zielführend. Mal ein
C++-Grundlagenbuch in die Hand zu nehmen wäre eventuell sinnvoller.
oop(s) schrieb:> Nein, protected vs. private verhält sich unter Java exakt genau so wie> unter C++.
Tatsächlich. Mein letzter Java-Kontakt ist nun aber auch ein paar
Jährchen her. Hatte irgendwie in Erinnerung dass Vererbung dort
grundsätzlich public wär. Auch OK.
oop(s) schrieb:> Intuition ist an der Stelle auch nicht wirklich zielführend. Mal ein> C++-Grundlagenbuch in die Hand zu nehmen wäre eventuell sinnvoller.
Ja ist es.
Ich kann aber den Gedankengang des TOs schon irgendwo nachvollziehen.
Milhouse van Hauten schrieb:> Es machte mich deshalb stuzig, weil eine Ableitung eine> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen> Felder" nicht zugreifen zu können.
Naja jetzt weiß er Bescheid...
Milhouse van Hauten schrieb:> Es machte mich deshalb stuzig, weil eine Ableitung eine> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse> eine Basisklasse. Deswegen sah ich den Grund nicht, auf "meine eigenen> Felder" nicht zugreifen zu können.
Nun, eine Klasse sollte ja erstmal in sich abgeschlossen sein. Zugriff
auf ihre privaten Members macht sie nur selber - kein anderer kann
dazwischenfunken. Durch die Verwendung von private sagt der Entwickler,
dass er das auch genau so will. Das soll daher auch durch abgeleitete
Klassen nicht ausgehebelt werden können. Wenn der Entwickler der
Basisklasse will, dass die abgeleitete Klasse auf ein Element zugreift,
muss es eben in der Basisklasse mindestens protected sein - genau dafür
ist dieses ja da. Wer zugreifen kann, wird also von der Klasse
gesteuert, in der das Element definiert ist, nicht von der davon
abgeleiteten. Diese kann den Zugriff höchstens noch weiter einschränken
aber nicht erweitern.
- Für mich ein logisches Konzept.
> Wenn ich in einer Basisklasse eine public int amlege und die Basisklasse> mit public an eine andere Klasse vererbe, ist diese int dann auch in der> abgeleiteten Klasse public?
Ja.
Milhouse van Hauten schrieb:> Es machte mich deshalb stuzig, weil eine Ableitung eine> "Ist-Ein-Beziehung" ist. Nach der Definition IST die abgeleitete Klasse> eine Basisklasse.
Vom Konzept her, aber nicht was die konkrete Implementierung betrifft.
Natürlich kann eine Basisklasse Implementierungsdetails besitzen, die
von abgeleiteten Klassen nicht verändert werden dürfen.