die-informatiker.net Logo   3074 registrierte Benutzer.
Insgesamt 111019 Beiträge.
Suche
• erweiterte Suche
Login
Benutzername:
Passwort:
• Registrieren

Ein Projekt des

Skript (Vererbung) ...

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.
Foren-Übersicht / Einführung in die Programmierung (WS08/09)
Autor Nachricht
Fgzzzzzzfffghhhhhh
Decorator
Decorator


Beiträge: 156

Private Nachricht senden
 

Beitrag Verfasst am: Fr 19.12.08, 18:27       Titel: Skript (Vererbung) ... Nach oben

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

Antworten mit Zitat
Bernhard Frauendienst
Admin.em.
Admin.em.
Bernhard Frauendienst

Beiträge: 6010

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: Fr 19.12.08, 19:29       Titel: Re: Skript (Vererbung) ... Nach oben
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:

20
30


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.

Antworten mit Zitat
Arthur Zimek
LMU-Offiziell
LMU-Offiziell
Arthur Zimek

Beiträge: 164

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: Sa 20.12.08, 10:15       Titel: Nach oben

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.

Antworten mit Zitat
Bernhard Frauendienst
Admin.em.
Admin.em.
Bernhard Frauendienst

Beiträge: 6010

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: Sa 20.12.08, 11:52       Titel: Nach oben
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.

Antworten mit Zitat
Arthur Zimek
LMU-Offiziell
LMU-Offiziell
Arthur Zimek

Beiträge: 164

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: Do 08.01.09, 14:38       Titel: Nach oben

Das Kapitel gibt es in einer korrigierten Fassung online, der vorher falsch formulierte Punkt im Skript passt jetzt zum richtigen Beispiel.

Antworten mit Zitat
Foren-Übersicht / Einführung in die Programmierung (WS08/09)

Alle Zeiten sind GMT + 1 Stunde
Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


die-informatiker.net
Das Forum der Informatik an der LMU (Uni München)
Ein Projekt des LMU Alumni Informatik e.V.
News
Kontaktmesse LInk 2012
Mi 09.05.12, 9:43

News Archiv
alle Termine
Foren Info
Wichtige Links:
• Algebra I
• Informatik I
• Analysis I
• Informatik III
• Analysis II
• Programmierpraktikum
• Lineare Algebra I
• Analysis II
• Analysis II Übungen
• Bioinformatik-Portal
• Digitale Medien
• Diskrete Strukturen :: Übungsblätter
• Diskrete Strukturen
• Informatik II
• Informatik I



Impressum
© 2007 die-informatiker.net
Powered by phpBB 2.0.23 © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de und die-informatiker.net.