Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
diese Aufgabe habe ich schonmal versucht, hatte dabei aber große Schwierigkeiten. Deswegen der 2. Versuch.
Meine erste Frage lautet. Ist mit " x.equals(y) soll genau dann true liefern, wenn y ebenfalls ein Ausdruck
ist, der strukturell und inhaltlich mit x übereinstimmt."
folgendes gemeint?
du hast eine endlos rekursion gebaut. Deine equals funktion ruft sich selbst auf, wodurch der gleiche code nochmal ausgeführt wird und sich die equals methode wieder selbst aufruft und wieder und wieder.....
Ja, damit überschreibst du nicht equals(Object o), sondern erstellst eine weitere. Deine würde in den meisten Fällen nicht aufgerufen, sondern die #equals(Object o), die du nicht überschrieben hast.
Deshalb: An überschriebenes immer [USER=48687]@Override[/USER] an überschriebenes, dann gibts Compilerfehler wenns nicht passt.
compute versteckt den Aufruf der rechten und linken Teile vor den Subklassen, die Subklassen müssen dann nur noch ein combine die wirkliche Rechnung mit den beiden Werten implementieren, und sich nicht mehr darum kümmern, an die Werte zu kommen.
Das verhindert duplizierten Code (das Berechnen des rechten/linken, was sonst jede Subklasse machen müsse) und macht den Code auch übersichtlicher, weil man nur noch diese eine Rechenoperation mit 2 Werten implementieren muss.
Also, compute ist die öffentliche API, und mit combine wird den Subklassen die Implementation von compute zugunsten von was übersichtlicherem erspart.
Man könnte sich Zombie sparen, und die Subklassen compute implementieren lassen, hat dann aber doppelten Code, und muss sich selbst um die richtigen Aufrufe kümmern.
Das mag bei diesen kleinen Beispielen manchmal nicht so offensichtlich sein, aber bei größeren/komplexeren Methoden sieht man dann recht gut den Vorteil, die Subklassen nur sehr kleine Methoden überschrieben zu lassen, aber den ganzen Code drum herum in den Oberklassen zu kapseln.
Du hast ja recht mit dem was du schreibst aber will sie denn equals(Object o) überschreiben ? Für Const-Objekte würde ihre equals aufgerufen und das will sie doch.
Du hast ja recht mit dem was du schreibst aber will sie denn equals(Object o) überschreiben ? Für Const-Objekte würde ihre equals aufgerufen und das will sie doch.
Nur, wenn man den Aufruf von #equals selbst schreibt. Alle anderen Aufrufe, zB in Listen, benutzen die nicht überschriebene #equals.
Wenn man doch spezielle equals für einzelne Typen braucht, würde ich sie anders benenne, das führt sonst nur zu Verwirrung.
Aber, wäre meine Lösung laut Aufgabenstellung auch richtig (bezogen auf die equals Methode)? Und ich überschreibe, doch nicht die Methode sondern überlade sie?
Wie, JStein52 schon gesagt hat, funktioniert die Methode. Nirgendwo in der Aufgabenstellung steht aber, dass die equals Methode überschrieben wrden muss. Also, müsste die Methode doch richtig sein? Oder irre ich mich?
Und auch wenn Überschreiben nicht explizit gefordert ist und Typen nicht explizit angegeben sind: wenn die Methoden gleich heißen, würde ich immer davon ausgehen, dass die Methode aus der Superklasse gemeint ist