Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich wollte mal fragen wie ich private instantzvaribalen am besten vererben bzw. mit methoden weitergeben kann ...
also wenn ich eine klasse Baum hab mit der instanzvariablen blattfarbe, wie kann diese instanzvariable dann auf meine klasse apfelbaum extends baum weitergeben ohne die kapselung zu vernachlässigen?
grml aber wenn ich will dass die fabre von Apfel (extends Baum) grün ist kann ich doch nciht die farbe von der baum-instanz verändern, sondern das Apfel-objekt soll grün sein ...
Deswegen leitet du die Klasse ja ab. Und da es Instanzvariablen sind ändern sich die anderen Instanzen ja nicht. Dann einen Konstruktor erstellen der direkt beim Instanzieren den Setter aufruft und den Wert rot setzt.
also bei public Variablen gehe ich bei getter uns setter ja mit, aber warum denn bei zu vererbenden Variablen?! .. soll man da etwa auch Sicherheitsroutinen fahren, wenn eine Unterklasse eine ihr zugehörige Eigenschaft ändern möchte?
...besitzt Apfel automatisch eine eigene Version der Variablen "farbe" und, soweit programmiert, auch eigene Versionen der Getter- und Setter-Methoden.
Also kannst Du einfach eine Variable z.B.
Java:
private String farbe;
in Baum deklarieren.
Hier ein kurzes Besipiel:
Klasse Baum
Java:
public class Baum
{
private String farbe = null;
public String getFarbe(){
return this.farbe;
}
public void setFarbe(String farbe){
this.farbe = farbe;
}
}
Klasse Apfel
Java:
public class Apfel extends Baum
{
// Apfel besitzt hier nur die Attribute und Verhaltensweisen seiner Elternklasse
}
Ausführende Klasse
Java:
public class MainClass
{
public static void main(String[] args)
{
Baum baum = new Baum();
baum.setFarbe("Gruen");
Apfel apfel = new Apfel();
apfel.setFarbe("Rot");
System.out.println("Die Farbe des Baums ist " + baum.getFarbe());
System.out.println("Die Farbe des Apfels ist " + apfel.getFarbe());
}
}
Wie man sehen kann, wurde in Apfel keine neue Variable deklariert oder evtl. überschrieben...Vererbung halt!
Getter- ober Setter-Methoden braucht man für die Vererbung nicht. Und der Modifizierer protectedwird in diesem Zusammenhang auch nicht benötigt.
Instanzvariablen sollten immer private sein und nur über Getter- bzw. Setter-Methoden erreichbar sein. Das Schlüsselwort protected würde bedeuten,
dass die Variable von jeder erbenden Klasse ohne diese Methoden erreichbar wäre.
Das sollte man grundsätzlich unterbinden!
Ich glaub' das war's nicht ganz: also wenn ich eine klasse Baum hab mit der instanzvariablen blattfarbe, wie kann diese instanzvariable dann auf meine klasse apfelbaum extends baum weitergeben ohne die kapselung zu vernachlässigen?
Es geht darum, die Blattfarbe von Baum an "Apfelbaum extends Baum" weiterzugeben - und nicht "irgendwohin". Also sowas:
Java:
class Baum
{
private String farbe = "rot";
}
class Apfelbaum extends Baum
{
public void singe()
{
System.out.println("Oh Apfelbaum, oh Apfelbaum, wie "+farbe+" sind deine Blätter");
}
}
Das geht nicht, weil "farbe" private ist. Man sollte sie nicht public machen. Man sollte (oder will vielleicht) auch nicht einen public getter einführen. Man KÖNNTE sie protected machen, aber man könnte auch einen Protected getter einführen - was den Vorteil hätte, dass erbende Klassen die Farbe erstmal nur LESEN (aber eben nicht schreiben) dürfen.
Java:
class Baum
{
private String farbe = "rot";
protected String getFarbe() { return farbe; }
}
class Apfelbaum extends Baum
{
public void singe()
{
System.out.println("Oh Apfelbaum, oh Apfelbaum, wie "+getFarbe()+" sind deine Blätter");
}
}
Es kann aber schnell zu ungewollten Seiteneffekten führen, wenn man einfach ohne Einschränkung an irgendeiner Stelle einer Vererbungshierachie Variablen änern kann die sich beispielsweise in der Root-Klasse befinden. Zudem erschwert es die Fehlersuche. Es gilt halt allgemein als schlechter Stil.
(kommt nicht von mir :noe
aeh ja also das bsp mit den public methoden ist nicht passend für die diskussion.
Korrekt wäre dann das anbieten einer protected set/get-Geschichte, aber sofern man nur returned und setted ohne weiteres Vorgehen, wäre imho eine protected Variable genauso gut.
Ich habe mir den Link von Marco durchgelesen, und das Beispiel mit dem Logging lässt erahnen wohin die Gedanken führen.
Gegen den Einsatz von Getter- und Setter-Methoden ist ja auch nichts einzuwenden.
Ganz im Gegenteil wird deren Verwendung grundsätzlich erwartet bzw. gefordert.
Getter/Setter für private/protected Instanzvariablen ist nciht so ungewöhnlich, kann helfen Seiteneffekte zu verhindern bzw. zu erzwingen da es eben stark kapselt, gibt auch ein Refactoring dafür (Encapsulate Field).
Im Prinzip schon. Getter- und Setter-Methoden sollten imho immer die erste Wahl sein.
Da es sich hierbei aber um eine Konstante handelt, könnte man den Zugriff auch so erlauben.
Ist ja eh unveränderlich. Aber man sollte immer an Struktur und Übersichtlichkeit denken.
Oftmals sind Getter und Setter einfach aussagekräftiger (wieder imho).