PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Java - Klassen und Interfaces



Igeloeffnung
28-04-2007, 22:58
Hallo,

ich habe ein Problem bei einer Aufgabe in Java...
Wir sollen 2 Klassen und 2 Interfaces anlegen (iss ja nich schwer).

Die Oberklasse heißt "Hero" und soll die Methode "void swim()" haben.
Die andere Klasse mit dem Namen "ActionCharacter" soll die Methode "void fight()" haben und von Hero erben.
Das erste Interface heißt "ICanFight" und soll die Methode "void fight()" haben.
Das zweite Interface soll "ICanSwim" heißen und soll die Methode "void swim()" haben.
Beide Interfaces sollen in Hero implementiert werden.

Jede Methode der Klassen sollen "Klassenname.Methodennamen" und einen Zeilenumbruch ausgeben.

Soweit so gut.

Hier meine Source Codes:

ActionCharacter.java
----------------------------------------------------------
public class ActionCharacter extends Hero
{
public void fight()
{
System.out.println("ActionCharacter.fight");
}
}
----------------------------------------------------------

Hero.java
----------------------------------------------------------
public class Hero implements ICanFight, ICanSwim
{
public void swim()
{
System.out.println("Hero.swim");
}

public void fight()
{
System.out.println("Hero.fight");
}
}
----------------------------------------------------------

ICanFight.java
----------------------------------------------------------
interface ICanFight
{
void fight();
}
----------------------------------------------------------

ICanSwim.java
----------------------------------------------------------
interface ICanSwim
{
void swim();
}
----------------------------------------------------------

Ich hoffe die Interfaces sind richtig, habe noch nie mit Interfaces gearbeitet, habe aber extra nochmal nachgesehen und so hatten wir es mal in einer Vorlesung...


Nun zum Hauptprogramm (1:1 vom Übungszettel)

Adventure.java
----------------------------------------------------------
public class Adventure {

static void t(ICanFight x) { x.fight();}
static void u(ICanSwim x) { x.swim();}
static void w(ActionCharacter x) { x.fight(); }

public static void main(String[] args)
{
Hero h = new Hero();
t(h);
u(h);
w(h);
ActionCharacter ac = new ActionCharacter();
ac.fight();
}
}



Wir sollen angeben, was auf der Konsole ausgegeben wird. Nur leider bekomme ich bei "w(h);" andauernd beim compilieren einen Fehler:

Adventure.java:12: w(ActionCharacter) in Adventure cannot be applied to (Hero) w(h);

Kann mir vielleicht jemand erklären warum ???
Liegt es vielleicht daran, dass die Methode w ein Objekt vom Typ "ActionCharacter" haben möchte und ein Objekt vom Typ "Hero" bekommt. Und funktioniert es bei "ICanFight" und "ICanSwim" deshalb, weil es Interfaces der Klasse "Hero" sind und keine eigenen Klassen?

Und ich verstehe auch nicht wie Java die Variable bzw. das Objekt "h" instanziiert??? Es gibt doch gar keinen Konstruktor ????

Vielen Dank schonmal

Igeloeffnung
28-04-2007, 23:22
Ich habe inzwischen herausgefunden, dass der Fehler auf meiner Vermutung basiert. Die Methode will ein Objekt vom Typ "ActionCharacter" bekommt aber ein Objekt vom Typ "Hero"...

Würde man die Methode "w" nach der Instanziierung von "ac" mit dem Objekt "ac" (also "w(ac);") aufrufen funktioniert es...

Da stellt sich mir die Frage, ist es ein Fehler auf dem Übungsblatt oder sollten wir in diesen Fehler laufen. Aufgabenstellung war ja nur anzugeben, was das Hauptprogramm (Adventure.java) auf der Konsole ausgibt. Deshalb kann ich es mir nicht vorstellen, dass die auch noch extra Fehler einbauen (war zumindest noch nie so, wenn war es mit angegeben, wie z.B. "suchen sie den Fehler" oder "warum funktioniert es nicht").... Ich bin mir jetzt sehr unschlüssig was ich als antwort schreiben soll...

1. Es gibt gar nichts aus, da beim compilieren ein Fehler auftritt...

2. (Mit Korrektur des Programms) Es gibt
Hero.fight
Hero.swim
ActionCharacter.fight // von ac.fight
ActionCharacter.fight // von w(ac)

aus....

anda_skoa
29-04-2007, 16:26
Dem Namen der Klassen nach ist die Ableitungsrichtung falsch, d.h. Hero sollte von ActionCharacter ableiten.

Ob dann allerdings ActionCharacter die beiden Interfaces implementieren soll, oder nur eines und Hero das andere, kann man so nicht sagen.

Wenn du die Angaben hier korrekt wiedergegeben hast, sind da Fehler drinnen.

Ciao,
_

Igeloeffnung
30-04-2007, 01:19
Danke für die Antwort...

Ja, meine Zusammenfassung war richtig und es war der vermutete Fehler drin. Die Aufgabe habe ich inzwischen gelöst....

Aber trotz dessen, danke für die Antwort

Igeloeffnung
04-05-2007, 17:53
Ich hab nochmal nachgesehen.... Meine Impementaion war doch falsch. Oberklasse ist ActionCharacter und Unterklasse ist Hero und Hero implementiert auch die Interfaces. Somit haben sich gleich einige Probleme gelöst, aber danke für eure Hilfe