Polymorphie - Korrektur eines Quelltexts?

Miaming

Mitglied
Guten morgen und wieder mal ne kurze Frage bezogen auf Polymorphie:
(sorry vielleicht für einige etwas zu lächerlich, allerdings hab ich keine Person zur Hand die mir privat ein bisschen helfen könnte, deshalb stell ich eine Frage hier ins Forum)

Geg. ist folgender Quelltext:

Java:
public class geometrischeFigur { 
  
  public double Flaeche();
	
public  int Vergleiche(geometrischeFigur gf)  { 
   if( gf.Flaeche() > this.Flaeche()) 
    return -1; 
   else  if( gf.Flaeche() == this.Flaeche()) 
     return 0; 
    else  return 1; 
 }
  

}

ich soll herausfinden warum der code so nicht funktioniert - meiner meinnung nach liegt der grund in der deklaration der methode von "public double flaeche" - so sieht nämlich nicht der aufbau einer methode auf sondern ähnlich wie bei "int vergleiche" mit einer geschweiften klammer (ggf. enthaltene Paramater) usw. mein problem ist jetzt eigentlich nur, wie ich den quelltext so ändern kann, dass es funktioniert?


das vll als kleine hilfe:

-Die Klasse „GeometrischeFigur“ soll zweidimensionale geometrische Figuren (Kreise,
Rechtecke, Dreiecke, Parallelogramme, Rauten etc.) erfassen können.
- Methode „Flaeche()“ soll Flächeninhalt der jeweiligen geometrischen Figur ausgeben.

Meiner Meinung nach fehlt es an einem return Wert da in der Methode die Flaeche vom Typ double übergeben wird - im obigen Quelltext allerdings die Methode so wie sie da steht nicht funktioniert.

Kann mich vll jemand auf die korrekte Lösung bringen?
 
Hi.

Die Methode Flaeche der Klasse geometrischeFigur ist nicht definiert, also abstract. Du mußt die Klasse auch als "abstract" kennzeichnen.

Übrigens beginnen üblicherweise Klassennamen groß und Methodennamen mit einem Kleinbuchstaben.

Gruß
 
Guten Morgen,

und recht herzlichen Dank für deine Antwort! Ist es allgemein so, dass undefinierte Methoden abstract sind?

ps: ja du hast recht mit der korrekten Schreibweise der Klassennamen etc. Hierbei handelt es sich um eine Übungsaufgabe - Beschwerde bitte an meine Dozenten ^^ Aber danke schon einmal für deine Antwort
 
Zuletzt bearbeitet:
Ich hätte vielleicht dazu noch eine kleine Frage und zwar habe ich mir gerade nocheinmal näher anhand eines Beispiels und zwar hier was zum Thema abstrakte Methode durchgelesen.

Meine Frage nun: Kann die Operation „Vergleiche()“ von „Kreis“ ein Objekt der Klasse „Rechteck“ über-geben bekommen? Begründen Sie Ihre Antwort bitte umfassend und präzise!

(das vielleicht vorab als kleine Info: Die Klasse soll zweidimensionale geometrische Figuren (Kreise, Rechtecke, Dreiecke, Paral-lelogramme, Rauten etc.) erfassen können. Die Methode „Flaeche()“ soll hierbei den Flächen-inhalt der jeweiligen geometrischen Figur ausgeben.) (das ist von der übungsaufgabe der text)

Ich würde auf Anhieb die Frage mit "nein" beantworten, da ich davon ausgehe, wenn man den obigen Text nachvollzieht und sich dann die Vererbungsherachie vor Augen hält ist es ja unmöglich dass Kreis ein Objekt von Rechteck bekommt, da alle Klassen (Kreis, Rechteck, Raute etc.) von der Klasse geometrische Figur erben.

Die Methode "vergleiche" steht ja nur in der Klasse geometrische Figur. Liege ich mit meiner Aussage richtig oder geht das völlig in die falsche Richtung?
 
Ich hätte vielleicht dazu noch eine kleine Frage und zwar habe ich mir gerade nocheinmal näher anhand eines Beispiels und zwar hier was zum Thema abstrakte Methode durchgelesen.

Meine Frage nun: Kann die Operation „Vergleiche()“ von „Kreis“ ein Objekt der Klasse „Rechteck“ über-geben bekommen? Begründen Sie Ihre Antwort bitte umfassend und präzise!
Wäre zunächst die Frage wie die Vergleiche Operation von "Kreis" aussieht?
Ich würde auf Anhieb die Frage mit "nein" beantworten, da ich davon ausgehe, wenn man den obigen Text nachvollzieht und sich dann die Vererbungsherachie vor Augen hält ist es ja unmöglich dass Kreis ein Objekt von Rechteck bekommt, da alle Klassen (Kreis, Rechteck, Raute etc.) von der Klasse geometrische Figur erben.
Warum soll das unmöglich sein? Deiner Argumentation kann ich nicht folgen...
Die Methode "vergleiche" steht ja nur in der Klasse geometrische Figur. Liege ich mit meiner Aussage richtig oder geht das völlig in die falsche Richtung?
Warum probierst du es nicht wenigstens aus?

Gruß
 
ich kann es durchaus ausprobieren ja, es bringt mir aber nichts wenn ich es durch versuchen herausfinde und dann feststelle "aha es geht / es geht nicht" da mir nämlich dann dazu die begründung fehlt und ich lediglich "durch Versuchen" die frage mit "ja" oder "nein" beantworten könnte jedoch die plausible erklärung dazu fehlt. allerdings werde ich versuchen nach dem frühstück dies im quelltext umzusetzen

Wäre zunächst die Frage wie die Vergleiche Operation von "Kreis" aussieht?
In der Aufgabenstellung gibt es dazu keine Angabe. Lediglich bereits geposteter Quelltext zur Klasse "gemoetrische Figur" ist bekannt.

aus meiner sicht (jetzt zumindest) kann mir halt nicht vorstellen, dass die Methode von Kreis ein Objekt der Klasse Rechteck übergeben bekommen kann, wenn diese beiden Klassen keinen Bezug zueinander haben. Kreis und Rechteck erben von der Klasse geometrische Figur. Aber sonst nichts, deshalb gehe ich davon aus dass es nicht umsetzbar wäre.

Und deshalb wollte ich eig wissen ob meine Aussage richtig oder falsch ist - fernab davon werde ich dies nacher in Java umsetzen und mich ggf. eines besseren Belehren lassen, allerdings würde ich mich freuen eine halbwegs fachliche Begründung zu bekommen da mir leider noch das nötige wissen fehlt
 
Kreis und Rechteck erben von der Klasse geometrische Figur
Und damit hast du die Sache schon beantwortet: Ja, es ist möglich!

Wenn man sich mal die Vererbungshierarchie vorstellt (z.B. mit einem Klassendiagramm), dann kann man das daran sehr gut erklären. Alle abgeleiteten Klassen sind durch die Ableitung auch Objekte von der Vaterklasse (z.B. Kreis ist gleichzeitig auch GeometrischeFigur). Man kann immer die letztendliche Implementierung verwenden, man kann die Objekt-Typen aber auch auf einen gemeinsamen Nenner reduzieren, indem man in der Vererbungshierarchie weiter rauf geht. In diesen Datentyp können Instanzen von allen abgeleiteten Datentypen. Man kann die besonderen Fähigkeiten der abgeleiteten Typen zwar nicht nutzen, sondern nur die, die alle gemeinsam haben, aber darum geht es ja auch.

So, die Methode Vergleiche bekommt ein Objekt vom Typ GeometrischeFigur und es werden nur die Flächen verglichen. Die Methode Flaeche existiert bereits in dem Kontext, hat nur noch keine Implementierung. Stört aber nicht, aufrufen kann man sie dennoch. Da die Bedingung nur die ist, dass der Parameter ein GeometrischeFigur Objekt sein soll, kann es ein Kreis, ein Rechteck, ein Dreieck, etc. sein, denn alle erben ja von GeometrischeFigur. Und damit kann auch ein Kreis-Objekt mit einem Rechteck-Objekt verglichen werden oder auch mit anderen.

Übrigens muss nicht nur die Klasse als abstract deklariert werden, sondern auch die Methoden, die abstrakt sein sollen. Das fällt nur bei Interfaces weg, weil Interfaces generell keine Implementierung haben können.

Und noch etwas. Ich habe mir vor Ewigkeiten mal ein Projekt angelegt (bei mir heißt es Test), das haufenweise Packages beinhaltet zu allen möglichen Themen. Wenn man sich nicht sicher ist, ob etwas geht oder nicht, dann einfach ausprobieren. Vielleicht kann man nicht sofort ausm Kopf sich das herleiten, aber wenn man das Test-Programm getippt und ausgeführt hat, dann kommt sehr oft die Erkenntnis. Je nach Thema kann man das dann noch auf andere Weisen ausprobieren (Polymorphie z.B. eignet sich dafür super) und spätestens dann hat man die Erkenntnisse und Antworten.

Eine Programmiersprache kann man nicht lernen, indem man nur Liest. Man kann dadurch das Wissen erlangen, aber kein Mensch kann alles aufschreiben, was eine Sprache kann und was die Besonderheiten sind. Wenn man eine Theorie oder Idee hat und sich nicht sicher ist, dann ausprobieren! Es bringt nichts, wenn man mit der Unsicherheit durch's Leben läuft.
 
Zuletzt bearbeitet:
Zurück