Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse

StupidAttack

Bekanntes Mitglied
Huhu

Habe ein abstraktes Problem, dass allerdings ziemlich schnell gelöst werden kann(glaube ich). Onkel google scheint mir überfragt.
Java:
public abstract class Haustiere
{
	String name;
	double futtervorrat;
	int anzahlTage;

	public Haustiere (String name, double futtervorrat) 
	{
	this.name = name; 
	this.futtervorrat = futtervorrat;  
	this.anzahlTage = anzahlTage;     
	}

	public void fuettern()            //DIES BETRIFFT MEINE FRAGE
	{

  	public abstract void sprich();          

	while(futtervorrat>0) 
	public abstract void friss();
        }		
	
	public void anzeigen()
	{
	System.out.println("haustiername: "+name+" Futter reicht: ");
	}

}


meine frage betrifft den kommentiert gedruckten Teil:

Kann ich in einer abstrakten Klasse, in einer nicht abstrakten methode (fuettern) 2 abstrakte Methoden einbauen? Also die 2 abstrakten Methoden werde ich in den Unterklassen schreiben, doch ich will dann in meinen Objekten (die der Unterklassen) auf die nicht abstrakte Methode fuettern zurückgreifen...geht das? mein compiler sagt nein, andere probleme kann ich 8eigentlich) auschliessen...

Danke für eure Hilfe!
 
Hab es gerade mal selbst an nem eigenen Stück Code ausprobiert, scheint nicht zu gehen, wie es aussieht. Allerdings sehe ich auch nicht soo die Notwendigkeit dafür, das zu tun, denn was bezweckst du damit? Dann hast du bspw. eine Methode, die zwei andere Methoden aufruft. Das hättest du auch einfacher haben können, indem du die beiden gewünschten Methoden direkt in die Main-Methode schreibst, denke ich…
 
Kurz und gut: Nein. Abstract hin oder her - rein syntaktisch kann man keine Methoden in dem Rumpf anderer Methoden definieren.
 
Hab es gerade mal selbst an nem eigenen Stück Code ausprobiert, scheint nicht zu gehen, wie es aussieht. Allerdings sehe ich auch nicht soo die Notwendigkeit dafür, das zu tun, denn was bezweckst du damit? Dann hast du bspw. eine Methode, die zwei andere Methoden aufruft. Das hättest du auch einfacher haben können, indem du die beiden gewünschten Methoden direkt in die Main-Methode schreibst, denke ich…

Gute Frage, ich mache dass aus rein didaktischen Gründen, ich will also lernen und kein Problem lösen. und es wäre dabei schön wenn ich Polymorphie und Vererbung/ abstrakte Klassen miteinbeziehen kann. In der main methode wäre ein solches dingens natürlich besser aufgehoben, aber für grössere Projekte der Übersichtlichkeit zum zwecke wählte ich halt diesen weg...


@ fassy:

mhh, aber ich definiere die Methode doch noch gar nicht, ich teile dem Compiler doch nur mit, dass meine Unterklassen die Definition übernehmen werden. Aber sonst bin ich mit dem Faktum, das das schlichtwegs ned geht, zufrieden. Danke.

Wahrscheinlich habe ich die Aufgabenstellung einfach verfehlt:

Erstellen Sie eine abstrakte Klasse Haustiere. Die Klasse besteht aus

* den Instanzvariablen

String name;
double futtervorrat;
int anzahlTage; // gibt die Anzahl Tage aus, die der Futtervorat reicht

* einem Konstruktor, der die beiden Instanzvariablen name und futtervorrat initialisiert ( Dieser Kontruktor kann zwar nicht direkt genutzt werden, da die abstrakte Klasse Haustiere nicht instanziiert werden kann, aber er kann von den Subklassen Katze und Hund verwendet werden.)
* der Methode

public void fuettern()
{
// Hier erfolgt zuerst der Aufruf der Methode sprich().
// Solange der Futtervorat reicht, wird dann die Methode friss() aufgerufen
// und die Anzahl der Tage hochgezählt, die der Vorrat reicht.
// Implementiert werden die abstrakten Methoden sprich() und friss() erst in den Subklassen.
}

* der Methode

public void anzeigen()
{
// zeigt den Namen des Haustiers an und wie viele Tage der Futtervorrat reicht
}

* und den abstrakten Methoden

public abstract void friss();
public abstract void sprich();





b???:L
 
Lt. Aufgabenstellung sollst Du in fuettern() die Methode sprich() aufrufen (und nicht etwa deklarieren, was syntaktisch tatsächlich nicht möglich ist).
 
Ja, die Schilderung der Aufgabenstellung ist tatsächlich etwas verwirrend. Es wird über die Methoden sprich() und friss() geredet, noch ehe die (bei dir mit Sternchen markierte) Aufzählung überhaupt dort angelangt ist. Vielmehr hätte man den Teil
* und den abstrakten Methoden

public abstract void friss();
public abstract void sprich();
vor das ganze fuettern()-Teil stellen sollen. Denkt man es sich nämlich mal auf diese Weise um, ergäbe das folgenden Code:

Java:
public abstract class Haustiere {
	public abstract void sprich();
	public abstract void friss();
	public void fuettern() {
		sprich();
		friss();
	}
}

class Hund extends Haustiere {
	public void sprich() {
		//irgendwas
	}
	public void friss() {
		//irgendwas
	}
}

Und DAS wiederum lässt sich durchaus kompilieren.
Hilft dir das weiter?
 

Zurück
Oben