Ein Projekt des
|
| Autor |
Nachricht |
|
Fgzzzzzzfffghhhhhh
Decorator

Beiträge: 156
|
Verfasst am: Fr 19.12.08, 18:27
Titel: Skript (Vererbung) ...
|
|
|
Geht um Teil 12 des Skripts: Folie 533 und 534 
| Zitat: |
Problematisch ist, wenn Methoden aus der Vaterklasse vererbt werden,
die eigentlich das versteckte Attribut verändern sollen, nun aber durch
den Verstecken-Effekt das neue Attribut der abgeleiteten Klasse
verändern. |
Was ist jetzt nicht verstehe... Der Verstecken-Effekt ist doch genau der, dass bei gleichnamigen Variablen, die vererbte Methode nur die ebenfalls vererbte Variable sieht. Aber NICHT die neue in der abgeleiteten Klasse...
|
|
|
|
|
|
|
|
|
|
|
Bernhard Frauendienst
Admin.em.


Beiträge: 6010
|
Verfasst am: Fr 19.12.08, 19:29
Titel: Re: Skript (Vererbung) ...
|
|
| flashas hat Folgendes geschrieben: |
| Was ist jetzt nicht verstehe... Der Verstecken-Effekt ist doch genau der, dass bei gleichnamigen Variablen, die vererbte Methode nur die ebenfalls vererbte Variable sieht. Aber NICHT die neue in der abgeleiteten Klasse... |
Das ist richtig. Ich fasse das ebenso wie du auf, und denke, dass es sich hierbei um einen Fehler im Skript handelt.
Kleiner test:
public class A {
public int a = 20;
public void printOldA() {
System.out.println(a);
}
}
public class B extends A {
public int a = 30;
public void printNewA() {
System.out.println(a);
}
}
....
public static void main(String[] args) {
B b = new B();
b.printOldA();
b.printNewA();
}
gibt wie erwartet aus:
Problematisch kann das allenfalls werden, wenn man eine Variable der Elternklasse benutzt, diese dann aber "aus Versehen" verdeckt, und damit fehlerhaftes Verhalten erzeugt, ohne eine Fehlermeldung auszulösen. Das ist aber dann Ungeschicktheit des Programmierers.
Die Situation wie im Skript aufgeführt kann so nicht auftreten, da Methoden der Elternklasse trotz Vererbung nicht auf die Variablen der Kind-Klasse zugreifen können.
Deswegen kann man ja Variablen auch als private deklarieren, das würde ja sonst gar keinen Nutzen haben, wenn man sie in der Kindklasse wieder sichtbar machen könnte.
|
|
|
|
|
|
|
|
|
|
|
Arthur Zimek
LMU-Offiziell


Beiträge: 164
|
Verfasst am: Sa 20.12.08, 10:15
Titel:
|
|
|
Das Beispiel im Skript beschreibt etwas anderes: wir haben in Ober- und Unterklasse jeweils ein Attribut name, die Methode getName() gibt es aber nur in der Oberklasse. Der Benutzer der Unterklasse könnte nun dem Irrtum unterliegen, diese Methode würde den Wert des Attributs aus der Unterklasse zurückgeben, aber das kann diese Methode, wie hier ganz richtig bemerkt, eben nicht. Damit sie das tut, müßte sie überschrieben werden.
Insgesamt ist das ein Beispiel für ungeschicktes Programmieren und wir folgern: Es ist einfacher, das Verstecken von Attributen zu vermeiden.
|
|
|
|
|
|
|
|
|
|
|
Bernhard Frauendienst
Admin.em.


Beiträge: 6010
|
Verfasst am: Sa 20.12.08, 11:52
Titel:
|
|
| Arthur Zimek hat Folgendes geschrieben: |
| Das Beispiel im Skript beschreibt etwas anderes: wir haben in Ober- und Unterklasse jeweils ein Attribut name, die Methode getName() gibt es aber nur in der Oberklasse. Der Benutzer der Unterklasse könnte nun dem Irrtum unterliegen, diese Methode würde den Wert des Attributs aus der Unterklasse zurückgeben, aber das kann diese Methode, wie hier ganz richtig bemerkt, eben nicht. Damit sie das tut, müßte sie überschrieben werden. |
Das ist für mich aus der Formulierung im Skript ehrlich gesagt nicht ganz ersichtlich. Dieser Beschreibung folgend müsste es ja heißen "die das neue Attribut der abgeleiteten Klasse verändern sollen, tatsächlich aber das versteckte Attribut verändern", also genau umgekehrt.
| Arthur Zimek hat Folgendes geschrieben: |
| Insgesamt ist das ein Beispiel für ungeschicktes Programmieren und wir folgern: Es ist einfacher, das Verstecken von Attributen zu vermeiden. |
Da stimme ich voll zu. Wenn man Werte der Elternklasse setzen will, benutzt man am besten entsprechende setter (die im Zweifelsfall eben protected sind, wenn sie nicht öffentlich benutzt werden sollen). Diese greifen, wie wir oben gemeinsam erläutert haben, ja immer auf die Variable zu, für die sie geschrieben wurden 
Wobei es natürlich trotzdem Situationen gibt, in denen der Zugriff auf Eltern-Variablen gerechtfertigt sein dürfte.
|
|
|
|
|
|
|
|
|
|
|
Arthur Zimek
LMU-Offiziell


Beiträge: 164
|
Verfasst am: Do 08.01.09, 14:38
Titel:
|
|
|
Das Kapitel gibt es in einer korrigierten Fassung online, der vorher falsch formulierte Punkt im Skript passt jetzt zum richtigen Beispiel.
|
|
|
|
|
|
|
|
|
|
|
|
|