WinFuture-Forum.de: [Java] Methode überschreiben - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

[Java] Methode überschreiben


#1 Mitglied ist offline   `Jimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 79
  • Beigetreten: 18. Oktober 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Leipzig

geschrieben 23. September 2011 - 14:30

Hallo Leute,

ich dreh mich an der Stelle im Kreis, vlt. könnt ihr mir helfen:
3 Klassen. Eine Klasse "User" im Package "control". 2 Klassen "Field" und "Block" im Package "data".
In User steht:
public class User {
	public static void main(String[] args) {
		Field sudoku = new Field();
		sudoku.setValue(1, 1, 1);
	}
}



Und in Field:
public class Field {	
	public Field() 
        {	}
	
	public void setValue(int x, int y, int value) {
		System.out.println("Field macht");
	}
}



soweit denke ich nicht schwer nachzuvollziehen, in user wird ein objekt von field erzeugt und die methode setValue genutzt. Nun würde ich aber gerne dass die Unterklasse von Field names Block die Methode von ihrer Oberklasse überschreibt.
Daher folgender Code:
public class Block extends Field {

	@Override public void setValue(int x, int y, int value) {
		System.out.println("Block macht");
	}
}



soweit ja alles Supi, compiler meckert nicht und leichter code, aber auf der ausgabe erscheint:
"Field macht"... Es sollte aber "Block macht" erscheinen, denn die Methode wurde doch überschrieben?!
Ich hoffe jmd. kann mir helfen,

danke euch Jimmy.
0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.090
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 23. September 2011 - 14:46

Auch, wenn mein letztes Java-Programm schon etwas her ist, meine ich, daß es daran liegt, daß Du Block gar nicht verwendest. Block erbt von der Klasse Field und überschreibt dabei setValue. Wenn Du als Ausgabe "Block macht" willst, muß Du Field in der Klasse User durch Block ersetzen. An Field ändert sich ja nichts, wenn Du eine neue Klasse (Block) davon ableitest.

Ich glaube, was Du suchst, ist ein sog. interface. Das ist eine Klasse, die eine gewisse Schnittstelle vorgibt, aber die Methoden nicht implementiert. So eine Art Headerdatei, wie bei C/C++, falls Dir das mehr sagt.

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 23. September 2011 - 14:50

0

#3 Mitglied ist offline   `Jimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 79
  • Beigetreten: 18. Oktober 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Leipzig

geschrieben 23. September 2011 - 15:12

ja schon, aber ich wollte eigentlich dieses kleine prog schreiben damit ich mal was über klassenhierarchien lerne.
ich dachte mir dass wie mit dem säugetier -> mensch -> etc prinzip.
bei einem interface wären doch alle klassen "gleichberechtigt". müsste doch möglich sein, "befehle" nach unten durchzureichen ohne jedesmal eine neue methode zu erfinden.
so ungefähr: chef sagt zum teamleiter "koche kaffee", der teamleiter sagt seinem mitarbeiter "koche kaffee" und der sagt dem praktikant ...
der kaffee bleibt ja gleich.. hoffe ich verlauf mich gerade nicht mit meinem gedanken :-)
0

#4 Mitglied ist offline   Mr. Floppy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.090
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 23. September 2011 - 15:30

Na ja, so funktioniert das aber nicht. Bleiben wir doch mal bei Deinem Beispiel. Wir haben Säugetier(User) -> Mensch(Field) -> Mann(Block). Du willst mit Mann eine Methode von Mensch überschreiben. Daß das ein Problem ist, merkt man spätestens, wenn man von Mensch eine Frau ableiten will. Was passiert z.B., wenn Mann und Frau dieselbe Methode in Mensch überschreiben wollen?

Das mit der Vererbung läuft halt so, daß eine abgeleitete Klasse alle Eigenschaften der Elternklasse erbt, aber die Kinder ihrerseits keine Eigenschaften der Eltern ändern (können). So ist es im wahren Leben ja auch. Was Du machen willst und was Du tatsächlich gemacht hast, sind zwei Paar Schuhe. Du willst was an der Elternklasse ändern, hast aber tatsächlich was in der Kindklasse geändert. Wenn Deine Klasse also sagt ich bin ein Mensch, liegt das daran, daß Du in Säugetier nur einen Menschen und keinen Mann erschaffen hast.

EDIT:
Das mit dem nach unten durchreichen, funktioniert doch auch. Wenn Du willst, daß ein Mann wie ein Mensch Kaffee kochen kann, darfst Du diese Fähigkeit halt nicht mit Tee kochen überschreiben. Man erbt ja auch nicht von Klassen, um dann deren Funktionalität zu überschreiben, sondern um die bereits bestehenden Methoden zu nutzen und neue hinzuzufügen (beim Mann z.B. im Stehen pinkeln :P ).

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 23. September 2011 - 15:49

0

#5 Mitglied ist offline   `Jimmy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 79
  • Beigetreten: 18. Oktober 04
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Leipzig

geschrieben 25. September 2011 - 23:43

Aber in meinem Beispiel bleibt es doch Kaffee kochen (public void setValue..)
Ich versuch das ganze mal umzustruktieren, aber im Prinzip dachte ich, dass die Methode in der Unterklasse die Methode in der Oberklasse "ersetzt" bzw. wie du sagtest erweitert. Ich wäre also auch mit diesem Ergebniss zufrieden:
"Field macht"
"Block macht"

Was bei mir noch nicht ganz ankommt ist, dass Block sich gar nicht angesprochen fühlt.
Aber wie gesagt, ich überdenke nochmal alles.
Vielen dank für deine Anregungen, bringen neues Licht rein.

Liebe Grüße Jimmy!
0

#6 Mitglied ist offline   Mr. Floppy 

  • Gruppe: aktive Mitglieder
  • Beiträge: 4.090
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 26. September 2011 - 08:58

Zitat

Aber in meinem Beispiel bleibt es doch Kaffee kochen (public void setValue..)
Eben nicht! Genau das ist ja das Problem. Dann nehmen wir halt das Chef und Untergebene Beispiel. Angenommen ein Mensch (Field) kann Kaffee kochen (setValue) und alle Angestellten (Block) sind Menschen (Field). Statt diese Fähigkeit zu erben, erben sie in Deinem Code nur die Bezeichnung, machen aber tatsächlich was ganz anderes. Bei einem Menschen bedeutet Kaffee kochen gebe "Field macht" aus, bei einem Angestellten hingegen gebe "Block macht" aus. Durch das Überschreiben werden die Angestellten quasi einer Gehirnwäsche unterzogen.

Zitat

Was bei mir noch nicht ganz ankommt ist, dass Block sich gar nicht angesprochen fühlt.
Das liegt auch daran, was Du für eine Ausgabe erwartest. Ein Block würde auch "Field macht" ausgeben, wenn Du die setValue Methode nicht überschreiben würdest! Es ist ja nicht so, daß Field was macht, sondern Block diese Funktionalität erbt. Wenn Boris Beckers Kinder irgendwann mal Tennisspiele gewinnen, haben sie das dem vererbten Talent zu verdanken und nicht dem Vater, der für sie spielt. Mit der Ausgabe "<Klasse> macht" erfährst Du also höchstens, von welcher Klasse die Funktion geerbt wurde, aber nicht wer sie gerade aufgerufen hat.

Warum Block sich nicht angesprochen fühlt, ist doch logisch. In Deiner Hauptklasse User legst Du nur ein Field Objekt an - mehr nicht. Block wird lediglich definiert, aber nicht verwendet. Wenn Du so willst, gibt es in Deinem Büro nur einen Chef/Menschen. Ändere das mal so ab:

public class User {
        public static void main(String[] args) {
                Block sudoku = new Block();
                sudoku.setValue(1, 1, 1);
        }
}

public class Field {    
        public Field() 
        {       }
        
        public void setValue(int x, int y, int value) {
                System.out.println("koche Kaffee");
        }
}

public class Block extends Field {

        public void otherMethod(int foo) {
                System.out.println("koche Tee");
        }
}


Du wirst sehen, daß auch Block Kaffee kochen kann, weil diese Methode von Field geerbt wurde. Zusätzlich kann Block auch Tee kochen, was Field nicht kann.

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 26. September 2011 - 09:06

0

#7 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.686
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 26. September 2011 - 10:20

Vielleicht geht dir bei folgendem Konstrukt, das du stattdessen einsetzen musst, ein Licht auf:
Field sudoku = new Block();
sudoku.setValue(1, 1, 1);



Hierbei rufst du die Methode setValue der Klasse Block auf. Stichwort: Polymorphismus
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0