Vererbung

Neue Frage »

Auf diesen Beitrag antworten »
javaneu Vererbung

Meine Frage:
Hallo ich habe gerade bei dieser Aufgabe probleme:

In dieser Aufgabe sollen Sie mathematische Ausdrücke
objektorientiert modellieren und dabei die Eigenschaften der Vererbung ausnutzen.
a) Erstellen Sie dazu zunächst ein Interface Term, dass nur die Methode public int getValue()
enthält.
b) Schreiben Sie eine Klasse AbsoluteTerm, die Term implementiert. Jedes Objekt dieser Klasse soll
einen (unveränderlichen) int-Wert speichern, der dem Konstruktor als Parameter übergeben wird.
Die Methode getValue() der Klasse soll diesen Wert zurückgeben.
c) Schreiben Sie als Nächstes die abstrakte Klasse BinaryOperation, die ebenfalls das Interface
Term implementiert. Schreiben Sie die Methoden public Term getLeft() und public Term
getRight(), die den linken bzw. rechten im Konstruktor festgelegten Operanden der Operation
zurückgeben. Die Methode getValue() schreiben Sie hier nicht ? warum geht das?
d) Erstellen Sie die Klasse Addition als Unterklasse von BinaryOperation und implementieren Sie
nun die Methode getValue() so, dass diese die arithmetische Summe der beiden Operanden berechnet
und zurückgibt. Vergessen Sie den Konstruktor der Klasse nicht.
e) Implementieren Sie die Klasse Factorial, die die Fakultät eines anderen Ausdrucks berechnet.
Überlegen Sie sich, was eine geeignete Oberklasse bzw. -interface sein könnte.
f) Überlegen Sie sich weitere mathematische Operationen und implementieren Sie diese, wie z.B. die
Exponentiation: ab. Ggf. müssen Sie Klassen weiterer Grundrechenarten
erstellen.
Zur Erinnerung: Fakultät von n ist definiert als: n! = 1  2  3  . . .  n

Meine Ideen:
Interface

code:
1:
2:
3:
4:
5:
6:
7:
8:
public interface Term
{
    public int getValue();
    
}




class Habe es so versucht
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public class AbsoluteTerm implements Term
{
   Wie soll der Konstruktor sein?

Echt doch nichts konkretes?


}

 
Auf diesen Beitrag antworten »
eulerscheZahl

So soll der Konstruktor sein:
code:
1:
2:
3:
AbsoluteTerm(int value) {
    //hier kommt noch was
}
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public class AbsoluteTerm implements Term
{AbsoluteTerm(int value) {
    
    this.value = value;
    //hier kommt noch was
}

public static void getValue(){
    return this.value;

}
}


Mir wird nur hier ein Fehler angezeigt:
public class AbsoluteTerm implements Term
Absolute term is not abstract and does not override abstract method getValue
Auf diesen Beitrag antworten »
Karlito

Hallo,

getValue() darf nicht static sein. Methoden und Felder sind nur als static zu kennzeichnen, wenn man sie ohne ein Objekt zu erzeugen aufrufen will.

Hier ein Beispiel zur Funktionsweise von static:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public class Beispiel{
	public static void statischeMethode(){
		System.out.println("Statische Methode aufgerufen.");
	}
	public void objektMethode(){
		System.out.println("Objektmethode aufgerufen.");
	}

	public static void main(String[] args){
		Beispiel.statischeMethode();
		//Beispiel.objektMethode();    //Geht nicht, weil vorher ein Objekt erzeugt werden muss
		Beispiel bsp = new Beispiel(); //Hier wird ein Objekt vom Typ Beispiel erzeugt und der 
																	 //Variable bsp zugewiesen
		bsp.objektMethode();
		bsp.statischeMethode();        //Geht auch
	}
}


Gruß,

Karlito
 
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 
public class AbsoluteTerm implements Term
{AbsoluteTerm(int value) {
    
    this.value = value;
    //hier kommt noch was
}

public  void getValue(){
    return this.value;

}
}              


Die Fehlermeldung bleibt trotzdem ?
Auf diesen Beitrag antworten »
Karlito

Ja, weil der Rückgabetyp nicht stimmt. Im Interface soll getValue() int zurückgeben. In der Klasse gibst du void (also nichts) zurück. Die Rückgabetypen müssen übereinstimmen. Im Prinzip kann man den Funktionskopf aus dem Interface kopieren. Sorry, dass ich das vorhin übersehen habe.

Edit: Weiterhin fällt mir gerade auf, dass es kein Feld value gibt. Deswegen solltest Du gleich noch mehr Fehler bekommen, weil this.vaiue nicht existiert.

Gruß,

Karlito
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:

public class AbsoluteTerm implements Term
{AbsoluteTerm(int value) {
    
    this.value = value;
    //hier kommt noch was
}

public  int getValue(){
    return this.value;

}
}




Aber wie soll ich sonst was zurückgeben ,wenn nicht mit value?
Auf diesen Beitrag antworten »
Karlito

Wie gesagt, es fehtl ein entpreichendes Feld in der Klasse:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public class AbsoluteTerm implements Term
{
	private int value; //dieses (private) Feld fehlt...

	AbsoluteTerm(int value) {
		this.value = value;
		//hier kommt noch was
	}

	public  int getValue(){
		return this.value;
	}
}


Diese Felder werden im Normalfall immer als private gekennzeichnet um dem Geheimnisprinzip gerecht zu werden.

Gruß,

Karlito
Auf diesen Beitrag antworten »
javaneu

public class AbsoluteTerm implements Term
{
private int value; //dieses (private) Feld fehlt...

AbsoluteTerm(int value) {
this.value = value;
//hier kommt noch was
}

Ich komme gerade nicht darauf , was ich noch hinzufügen kann?
Auf diesen Beitrag antworten »
eulerscheZahl

Der Beitrag eins über dir sieht doch gut aus.
Ich habe es jetzt nicht extra in eclipse kopiert, behaupte aber, da fehlt nichts mehr.
Auf diesen Beitrag antworten »
Karlito

Zeile 3 war das was gefehlt hatte. Ich habe es hinzugefügt.

Gruß,

Karlito
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public class AbsoluteTerm implements Term
{AbsoluteTerm(int value) {
    
    this.value = value;
    //hier kommt noch was
}

public  int getValue(){
    return this.value;

}
}

Mein blue j meckert aber trotzdem das cannot find symbol ( variabel value)
Auf diesen Beitrag antworten »
eulerscheZahl

So weit waren wir doch schon!
private int value; //dieses (private) Feld fehlt...
Auf diesen Beitrag antworten »
Karlito

Schau dir meinen Code an und deinen und ziehe deine Schlüsse...
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:

public class AbsoluteTerm implements Term{

private int value;
{AbsoluteTerm(int value) {
    
    this.value = value;
    //hier kommt noch was
}

public  int getValue(){
    return this.value;

}
}






Immer noch Fehler anzeige .class expected.

Tut mir leid wenn ich euch ein wenig nerve .
Programmieren ist kompletttes neuland für mich im moment.
Auf diesen Beitrag antworten »
eulerscheZahl

Kontrolliere mal die Klammersetzung.
Auf diesen Beitrag antworten »
javaneu

Blöder Fehler .
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public abstract class BinaryOperation implements Term
{
    
    private int Left;
    private int Right;
   public Term getLeft(){
       
       return this.Left;
       
    
    }
    
    public Term getRight(){
        
        return this.Right;
    
    
    }
}



Irgendwas stimmt hier wieder nicht .

Ich muss doch left und right als private definieren oder ?
Auf diesen Beitrag antworten »
eulerscheZahl

wenn Left und Right (nach Konvention eigentlich klein geschrieben) vom Typ int sind, musst du auch ein int zurückgeben.

Ich kenne BlueJ nicht, aber eclipse hilft dir auch bei gettern, kannst es ja mit BlueJ auch testen:
Lösche die Funktionen getLeft und getRight komplett. Tippe dann get und drücke Strg+Leertaste.
In eclipse (ebenso NetBeans) kommt da ein Menü, das dir getLeft anbietet. Wenn du das auswählst, wird der Code ergänzt.
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:

public abstract class BinaryOperation implements Term
{
    
    private int left;
    private int right;
   public Term getLeft(){
       
       return this.left;
       
    
    }
    
    public Term getRight(){
        
        return this.right;
    
    
    }
}



Funktioniert immer noch nicht ?
Auf diesen Beitrag antworten »
eulerscheZahl

Du hast doch nur die Groß-/Kleinschreibung geändert.

public int getLeft()
Auf diesen Beitrag antworten »
javaneu

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public abstract class BinaryOperation implements Term
{
    
    private int left;
    private int right;
   public Term int getLeft(){
       
       return this.left;
       
    
    }
    
    public Term int getRight(){
        
        return this.right;
    
    
    }
}



Fehler identifier expected markierung bei term
Auf diesen Beitrag antworten »
eulerscheZahl

Term hat an der Stelle ja auch nichts verloren.
Auf diesen Beitrag antworten »
Karlito RE: Vererbung

Zitat:
Original von javaneu
c) Schreiben Sie als Nächstes die abstrakte Klasse BinaryOperation, die ebenfalls das Interface
Term implementiert. Schreiben Sie die Methoden public Term getLeft() und public Term
getRight(), die den linken bzw. rechten im Konstruktor festgelegten Operanden der Operation
zurückgeben. Die Methode getValue() schreiben Sie hier nicht ? warum geht das?


Sorry euler, aber Term muss sogar der Rückgabetyp sein. Fehlerhaft ist der Type der privaten Felder. Außerdem fehlt noch der Konstruktor.

Gruß,

Karlito
Auf diesen Beitrag antworten »
javaneu

public abstract class BinaryOperation implements Term

Hier auch ein fEHLER:

Es wird gesagt BinaryOperation is public .

Should be declared in a file named Binary Operation.

Darf man das so nicht lassen?
Auf diesen Beitrag antworten »
eulerscheZahl

Steht doch alles da, du hast die Datei anders benannt, als die Klasse.
BinaryOperation gehört in die Datei BinaryOperation.java
Auf diesen Beitrag antworten »
javaneu

d) Erstellen Sie die Klasse Addition als Unterklasse von BinaryOperation und implementieren Sie
nun die Methode getValue() so, dass diese die arithmetische Summe der beiden Operanden berechnet
und zurückgibt. Vergessen Sie den Konstruktor der Klasse nicht.

Wie erstellt man genau eine Unterklasse bei java?
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
public class Addition extends BinaryOperation

Den Konstruktor solltest du bei BinaryOperation auch noch ergänzen.
Ist zwar abstract, aber irgendwo musst du right und left ja zuweisen.
Auf diesen Beitrag antworten »
javaneu

public class Addition extends BinaryOperation{
private int value;
AbsoluteTerm(int value) {

this.value = value;
//hier kommt noch was
}

public int getValue(){

return this.value;
}

}


Ich weiss das ich noch implementieren muss die get methode.

Aber blue j meckert schon .

invalid method ,return type required

Ich verliere die geduld unglücklich
Auf diesen Beitrag antworten »
eulerscheZahl

Um das Ganze abzukürzen:
code:
1:
2:
3:
public interface Term {
	public int getValue();
}


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
public abstract class BinaryOperation implements Term {
	private int left;
	private int right;

	public BinaryOperation(int left, int right) {
		this.left = left;
		this.right = right;
	}

	public int getLeft() {
		return left;
	}

	public int getRight() {
		return right;
	}
}


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public class Addition extends BinaryOperation {
	public Addition(int left, int right) {
		super(left, right);
	}

	@Override
	public int getValue() {
		return this.getLeft() + this.getRight();
	}
}


Addition braucht einen Konstruktor, der die Werte für rechts und links entgegennimmt. Diese werden dann an den Konstruktor der Basisklasse übergeben (super(left, right)). Ein Member value brauchst du nicht zwingend. Natürlich könntest du die Addition auch einmal im Konstruktor durchführen, statt jedes Mal bei getValue().
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »