Hallo zusammen,
Ich hab folgendes Problem. Ich wollte ein Testprogramm zum Thema
Vererbung machen. In der Klasse test ist die Variable t2 unter private,
sprich die sollte nicht mitvererbt werden oder? Die Klasse test2 erbt
von der Klasse test. Jetzt kann ich aber trotzdem über get uns set auf
die Variable t2 zugreifen (über eine Instanz der Klasse test2). Aber
soweit ich das kennengelernt haben werden Variable unter private nicht
mit vererbt. Warum exisitert diese Variable dann trotzdem in einer
Instanz von test2?
LG Mel
Private, protected und public kennzeichnen nur die Sichtbarkeit der
Methoden/Attributen.
Die Variable wird natürlich mitvererbt, da sie für die Funktion der
Basisklasse wichtig ist (oder wie soll dann das Get funktionieren?).
Das mit Get und Set ist eine beliebte Methode, dass man von aussen auf
private Variablen zugreifen kann, ohne etwas über die interen
Implementierung wissen zu müssen. Zusätzlich kann man get und set
überladen und dann auf eine andere Variable zugreifen.
Mel schrieb:> Aber> soweit ich das kennengelernt haben werden Variable unter private nicht> mit vererbt
Natürlich werden auch private deklarierte variablen (und Funktionen)
mitvererbt. Du kannst sie in einer abgeleiteten Klasse nur nicht direkt
nutzen.
Achso, nur wie kann ich die private deklarierten Variablen dann in der
abgeleiteten Klasse nutzen? Muss das dann auch wieder über get uns set
passieren?
Unser Prof hat nämlich in seinem Script stehen:
"Die abgeleitete Klasse besitzt alle Methoden und Datenelemente der
Basisklasse mit Ausnahme von: Datenelementen und Methoden der
Basisklasse mit dem Schlüsselwort private"
Das hat mich dann verwirrt dass das trotzdem funktioniert hat. Hoffen
wir mal dass ich dann in der Prüfung nix schreibe was er für falsch
hält:)
Aber vielen Dank für eure schnellen Antworten
Mel schrieb:> Unser Prof hat nämlich in seinem Script stehen:>> "Die abgeleitete Klasse besitzt alle Methoden und Datenelemente der> Basisklasse mit Ausnahme von: Datenelementen und Methoden der> Basisklasse mit dem Schlüsselwort private">
Der Satz ist so Unsinn.
Die abgeleitete Klasse besitzt grundsätzlich alle Methoden und
Datenelemente der Basisklasse. Ein Objekt der ageleiteten Klasse IST
gleichzeitig auch ein Objekt der Basisklasse. In jedem Objekt der
abgeleiteten Klasse steckt auch immer ein vollständiges Objekt der
Basisklasse drinnen.
Aber: verwendbar sind auch in einer abgeleiteten Klasse nur die
Methoden und Datenelemente die nicht 'private' markiert sind.
Mel schrieb:> Ahh gut ok, aber was kann ich dann mit den Sachen aus private anstellen,> wenn ich die nicht wirklich verwenden kann:/?
Eine Klasse macht Methoden und/oder Datenmember dann private, wenn sie
verhindern will, dass abgeleitete Klassen und/oder Friend-Klassen darauf
zugreifen können.
In einem gewissen Sinne errichtet private einen Zaun um diese
Klassenbestandteile und signalisiert so: Wenn du etwas von mir willst,
dann benutze bitte die offiziellen Kanäle (public oder protected) und
pfusch mir nicht direkt an den Werten rum. Ich alleine habe die
Oberhoheit darüber und ich will nicht, dass du dir über das
Hintertürchen 'dann leite ich eben davon ab' Zugang zu meinen
Datenmembern verschaffst.
Bei Methoden sind es meistens irgendwelche Hilfsmethoden, von denen die
Basisklasse ausgeht, dass ausser ihr die keiner jemals brauchen wird
oder aber Methoden, die nicht gefahrlos benutzt werden können, weil zb
bestimmte Reihenfolgen von Funktionsaufrufen einzuhalten sind.
Gut also macht die Verwendung von Private nur Sinn, wenn ich diese
Variable/Methode nur in Instanzen dieser Klasse verwenden will und
nirgendwo anders?
Mel schrieb:> Gut also macht die Verwendung von Private nur Sinn,
Das ist die falsche Sichtweise.
Grundsätzlich sollte in einer Klasse alles private sein, zumindest bei
den Datenmembern.
Und je nach Anforderungen lockert man dann diesen Schutz. Bei Methoden
ist das meistens unkritisch, bei Datenmember hingegen wehrt man sich als
C++ Programmierer nach Leibeskräften dagegen. Wobei der Wechsel von
private nach protected weniger schlimm ist, als wie wenn man nach public
geht. Datenmember die public sind, sind oft ein untrügerisches Zeichen
dafür, dass der Programmierer noch nicht in der OOP Welt angekommen ist.
Eine Klasse will ihre Kontrolle über Datenmember nur durch Androhung von
massiver Gewalt abgeben :-)
Bsp.
class Lichtschalter
private var SchalterPos, RelaisPos
public func SetSchalterPos(bool an/aus)
if(an)
begin
SchalterPos = true
RelaisPos = true
end
else
begin
SchalterPos = false
RelaisPos = false
end
endfunc
Mit dem umlegen des Schalters muss nuch die Variable RelaisPos gesetzt
werden, um tatsächlich das Licht zu schalten. Das geht nur über die
Verwendung von SetSchalterPos. Wäre SchalterPos public, könntest Du die
Variable ändern ohne das das Relais geschaltet werden würde. Ein
Verhalten was man nicht will.