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.
Guten Morgen miteinander!
Ich hab folgendes Interface:
Java:
public interface Term {
public int wert();
public String infix();
}
mit folgenden Klassen:
Java:
public class Konstante implements Term {
private int wert;
public Konstante (int wert){
this.wert = wert;
}
@Override
public int wert() {
return wert;
}
}
und
Java:
public class ZweiStelligeOperation implements Term {
protected Term ersterOperand;
protected Term zweiterOperand;
public ZweiStelligeOperation (Term ersterOperand, Term zweiterOperand){
this.ersterOperand = ersterOperand;
this.zweiterOperand = zweiterOperand;
}
@Override
public int wert() {
//Hier liegt mein Problem, mehr dazu am Ende des Posts
}
}
Ausserdem hat die Klasse ZweiStelligeOperation noch folgende Unterklasse:
Java:
public class Summe extends ZweiStelligeOperation {
public Summe (Term zweiterSummand, Term ersterSummand){
super(zweiterSummand,ersterSummand);
}
}
Mit dem Programm soll es letztendlich möglich sein dass man für einen Code wie beispielsweise den folgenden
Java:
Term s = new Konstante(12);
Term t = new Konstante(11);
Term u = new Summe(s,t);
System.out.println(u.wert());
das richtige Ergebnis bekommt. Mein Problem liegt wie gesagt in der wert()-Methode der ZweiStelligeOperation Klasse - Ich weiss nicht genau wie man das machen könnte. Ich habe mir gedacht man könnte das vielleicht folgendermaßen lösen:
Java:
public int wert() {
if (ersterOperand instanceof Summe && zweiterOperand instanceof Summe) return ersterOperand + zweiterOperand;
//es soll dann auch noch weitere Unterklassen zu ZweiStelligeOperation geben (Differenz, Produkt usw.)
}
Allerdings geht das so natürlich nicht weil ersterOperand und zweiterOperand jeweils vom Typ Term sind und sich das nicht einfach addieren oder zu int casten lässt.
Ich habe das nach der Vorgabe eines UML-Diagramms nachprogrammiert.
Tut mir Leid das hätte ich natürlich dazu sagen müssen!
edit: die infix() methoden habe ich nur nicht mitgepostet weil ich dachte da läge mein Problem nicht.
An welcher Stelle müsste ich die wert() Methode aufrufen? Im Konstruktor der ZweiStelligeOperation irgendwo?
Habe da schon dran gedacht aber konnte das nicht so recht umsetzen.
Die Summe sollte in dem Fall wohl auch den Term implementieren. Die wert() Methode eines zweistelligen Terms ist ja erstmal sinnlos und kann irgendwas zurück geben. Die wert() Methode der Summe dann den addierten wert der zwei Terme.
ZweistelligerTerm (oder wies auch immer hieß) muss ja garnicht Term implementieren, da sie von sich aus erstmal keinen Wert hat.
Mach die ZweistelligeOperation als abstrakte Klasse mit wert() als abstrakte Methode. Alle Klassen (also konkrete Operationen), die davon erben, implementieren wert() dann einfach selbst. So kannst Du die ganzen instanceof-Abfragen weglassen.
Deine Lösung wäre sowieso falsch, weil Du dann keine Konstanten summieren könntest - stattdessen willst Du nur Summen summieren. Da beißt sich die Katze in den Schwanz.
Die Summe sollte in dem Fall wohl auch den Term implementieren. Die wert() Methode eines zweistelligen Terms ist ja erstmal sinnlos und kann irgendwas zurück geben.
Mach die ZweistelligeOperation als abstrakte Klasse mit wert() als abstrakte Methode. Alle Klassen (also konkrete Operationen), die davon erben, implementieren wert() dann einfach selbst. So kannst Du die ganzen instanceof-Abfragen weglassen.
Deine Lösung wäre sowieso falsch, weil Du dann keine Konstanten summieren könntest - stattdessen willst Du nur Summen summieren. Da beißt sich die Katze in den Schwanz.
Sinnlos, weil eine ZweistelligeOperation ja erst dann einen Wert hat, wenn ein Operator dazu kommt. Den gibt es in der ZweistelligenOperation ja garnicht. Warum sollte sie dann "Term" implementieren?
Entweder kommt in die ZweistelligeOperation noch ein Operator, oder es muss eben entweder so gemacht werden, wie du es schreibst (erscheint mir am sinnvollsten)
Mach die ZweistelligeOperation als abstrakte Klasse mit wert() als abstrakte Methode. Alle Klassen (also konkrete Operationen), die davon erben, implementieren wert() dann einfach selbst. So kannst Du die ganzen instanceof-Abfragen weglassen.
Ich weiß nicht, wie Dein Klassendiagramm aussieht. Aber steht dort wirklich, dass die Klasse ZweistelligeOperation nicht abstrakt sein darf?
Abgesehen davon ist ja nichts verändert worden. Mit instanceof zu arbeiten anstatt die Vererbung selbst auszunutzen ist in dem Fall sehr schlechter Stil.
Sinnlos, weil eine ZweistelligeOperation ja erst dann einen Wert hat, wenn ein Operator dazu kommt. Den gibt es in der ZweistelligenOperation ja garnicht.
So wie es im Moment ist, ist es natürlich unfertig und sinnlos, ja. Aber generell die ZweistelligeOperation als Oberklasse für Nicht-Konstanten zu nutzen, halte ich für zweckmäßig. Es erspart duplizierten Code.
Hehe ja da hast du wohl Recht, tut mir Leid, dachte da müsste über dem Klassennamen ein <<abstract>> oder so stehen.
Ok vielen Dank schonmal soweit. Wie bekomme ich jetzt aber den ersten und zweiten Summanden addiert? Die sind ja wieder beide Objekte vom Typ Term? Ich schätze ich muss irgendwie die wert()-Methoden benutzen um die Werte der entsprechenden Objekte in eine Int-Variable zu packen damit ich damit auch rechnen kann, aber wie und wo würde das am besten gehen? Oder liege ich ganz falsch?
Hehe ja da hast du wohl Recht, tut mir Leid, dachte da müsste über dem Klassennamen ein <<abstract>> oder so stehen.
Ok vielen Dank schonmal soweit. Wie bekomme ich jetzt aber den ersten und zweiten Summanden addiert? Die sind ja wieder beide Objekte vom Typ Term? Ich schätze ich muss irgendwie die wert()-Methoden benutzen um die Werte der entsprechenden Objekte in eine Int-Variable zu packen damit ich damit auch rechnen kann, aber wie und wo würde das am besten gehen? Oder liege ich ganz falsch?