# Vererben von private instanzvariablen



## Luk10 (22. Dez 2009)

Hallo

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?

danke


----------



## diggaa1984 (22. Dez 2009)

machst sie protected ^^


----------



## Marco13 (22. Dez 2009)

Besser: Sie private lassen, und protected set/get-Methoden für dies Variable einführen.


----------



## Noctarius (22. Dez 2009)

Full Ack an Marco13


----------



## Luk10 (22. Dez 2009)

aber dann muss ich doch die variablen für die konkrete klasse neu schreiben ...


----------



## Noctarius (22. Dez 2009)

Nö, dafür hast du ja dann die Getter/Setter


----------



## Luk10 (22. Dez 2009)

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 ...


----------



## Noctarius (22. Dez 2009)

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.


----------



## ModellbahnerTT (22. Dez 2009)

Marco13 hat gesagt.:


> Besser: Sie private lassen, und protected set/get-Methoden für dies Variable einführen.


Hurra, Objektorientierte Programmierung ad absurdum :toll:
Wer hat eigentlich das Gerücht mit den Getter und Setter Methoden in die Welt gesetzt?


----------



## diggaa1984 (22. Dez 2009)

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?


----------



## Marco13 (22. Dez 2009)

ModellbahnerTT hat gesagt.:


> Hurra, Objektorientierte Programmierung ad absurdum :toll:
> Wer hat eigentlich das Gerücht mit den Getter und Setter Methoden in die Welt gesetzt?



Eigentlich gehe ich ja noch weiter: http://www.java-forum.org/allgemeine-java-themen/44575-staerkerer-access-modifier-private.html  Da es das "Uniform Access Principle" in Java nicht gibt, bleibt einem _eigentlich, theoretisch, und wenn man es theoretisch "formal sauber"_ machen wollte eigentlich nichts anderes übrig. Aber wer will das schon


----------



## Jan_Gerhard (22. Dez 2009)

Wenn Dein Apfel von Baum abgeleitet wird...

```
class Apfel extends Baum{
}
```
...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.

```
private String farbe;
```
in Baum deklarieren.

*Hier ein kurzes Besipiel:*

*Klasse Baum*

```
public class Baum
{
	private String farbe = null;
	
	public String getFarbe(){
		return this.farbe;
	}
	
	public void setFarbe(String farbe){
		this.farbe = farbe;
	}
}
```
*Klasse Apfel*

```
public class Apfel extends Baum
{
    // Apfel besitzt hier nur die Attribute und Verhaltensweisen seiner Elternklasse
}
```

*Ausführende Klasse*

```
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 *protected *wird 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 hoffe ich konnte etwas helfen.

Grüße an alle,
Jan


----------



## faetzminator (22. Dez 2009)

Jan_Gerhard hat gesagt.:


> Getter- ober Setter-Methoden braucht man für die Vererbung nicht. Und der Modifizierer *protected *wird in diesem Zusammenhang auch nicht benötigt.



Na, wenn von überall die Apfel-/Baumfarbe geändert werden soll :noe: !?


----------



## Marco13 (22. Dez 2009)

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:

```
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.

```
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");
    }
}
```


----------



## Jan_Gerhard (22. Dez 2009)

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


----------



## Marco13 (22. Dez 2009)

Deswegen die Variable nicht protected machen, sondern nur einen protected getter


----------



## diggaa1984 (22. Dez 2009)

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.


----------



## Jan_Gerhard (22. Dez 2009)

Gegen den Einsatz von Getter- und Setter-Methoden ist ja auch nichts einzuwenden.
Ganz im Gegenteil wird deren Verwendung grundsätzlich erwartet bzw. gefordert.


----------



## maki (22. Dez 2009)

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).


----------



## diggaa1984 (22. Dez 2009)

gilt das dann auch für 
	
	
	
	





```
final protected String SPECIAL_SETTING = "wow";
```


----------



## Jan_Gerhard (22. Dez 2009)

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).


----------

