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?
Sind die Felder zufällig "private"? Dann ist das so gewollt, in den Implementationsdetails soll sich fremder Code nicht einmischen können.
Ansonsten gibts neben private auch noch protected als Access Modifier. Hier sind die Member dann auch für abgeleitete Klassen nutzbar.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.