Java -BlueJ -MUD

Luukaes

Mitglied
Hallo,
in meinem ersten Semester Praktische Informatik dreht sich alles um ein MUD (Multi user dungeon)
es ist der 3. Übungszettel und jetzt habe ich ein problem, was wir in unserer Grupper einfach nicht gelöst bekommen...
Es sieht sehr einfach aus, wie ich finde, aber eine Lösung fällt uns trotzdem nicht ein!
Euere Hilfe wäre jetzt sehr willkommen! :)

also hier der code aus der Klasse "Person", es ist eine Print Methode, die den Namen der person ggf. ihren rahm und gff. ihrer Gegenstände ausgibt:

Java:
/**
     * Gibt den Namen dieser Person aus. Falls sich diese Person in einem Raum befindet,
     * wird zusätzlich der Name dieses Raumes ausgegeben. Falls diese Person 
     * Gegenstände trägt, werden zusätzlich die Namen dieser Gegenstände ausgegeben.
     * 
     * @since u1
     */
    public void print() {
        super.print();
        if (room != null) {
            System.out.println("///    Room:    " + room.getName());
        }
        if (inventory.getCollectables().isEmpty() == false) {
            int index = 0;
        while (index < inventory.getCollectables().size()) {
            if (inventory.getCollectables().get(index).equals(null)) {
                System.out.println("///    Item"+((index)+1)+":    " +(Collectable)inventory.getCollectables().get(index).getName());
return;
            }
            else ++index;
        }
        }
    }

die zeile
Java:
(Collectable)inventory.getCollectables().get(index).getName())
ist der Knackpunkt und hier das
Java:
getName()
die Methode
Java:
getCollectables()
aus
Java:
inventory
gibt hier eine arrylist wieder (
Java:
/**
     * Gibt die Liste der collectables in einem Inventar zurueck.
     */
     public ArrayList getCollectables() {
        return collectables;
    }
)
Java:
get(index)
sollte dann ja den Speciherot an der Stelle index zurückgeben und das ist dann ja ein "collectable" auf dem wir
Java:
getName()
aufrufen.
Java:
getName()
ist in "Subject" definiert, von dem "Item" erbet, von dem "Collectable" erbt, also sollte man auf einem "collectable" auch die Methode
Java:
getName()
aufrufen sollen.

Dachten wir.
Der Blues compiler sagt aber: cannot find symbol - method getName()

Irgendwelche Ideen? Was für infos habe ich vergasen, die man für die Lösung noch braucht??
Ich bin schon mal sehr dankbar für jede Hilfe!
 
Zuletzt bearbeitet:

eMmiE

Bekanntes Mitglied
Hi,

Code:
public class Subjekt {
//Konstuktor usw.
public String getName() {}
}

public class Atem extends Subjekt {}

public class collectable extends Atem {}

So sieht das aus?

a) ich glaube, dass du in collectable explizit mindestens einen Methodenrumpf reinbauen musst, der getName() heißt und dabei super.getName() aufruft, denn sonst ist die ... ganze.. Methode...nicht..............................sichtbar....???

Ich probier mal!
mom afk
 

Luukaes

Mitglied
Kurzer Hinweis: Autokorrektur hat aus "Item" "Atem" gemacht, Entschuldigung.
Aber das Prinzip ist richtig!
 
Zuletzt bearbeitet:

eMmiE

Bekanntes Mitglied
Ne,
das isses nich

-> Eclipse sagt :"Günther"
-> Java-Editor sagt:non-static variable cant be instantiated

b) WTF?
was wollt ihr mit einer solch unübersichtlichen Ableitungs / Vererbungsdingsdairgendwas machen?

Gruß? eMmi?E
 
Zuletzt bearbeitet:

Luukaes

Mitglied
Ne,
das isses nich
Was meinst du? mit
Aber das Prinzip ist richtig!
wollte ich nur sagen, dass du unsere Vererbungshierarchie richtig verstanden hast. ;)

Unser Projekt besteht ja aus mehr als aus "Subject"->"Item"->"Collectable", ich hab nur diesen Strang raus genommen, weil es der einzige ist, der Probleme bereitet.

sonst ist die ... ganze.. Methode...nicht..............................sichtbar....???

So wie ich es gelernt habe erbt jede Klasse die Methoden der Superklasse, wenn man diese explizit in einer unterklasse implementiert wird die aus der superklasse übergebene Methode nur überschrieben....
 

eMmiE

Bekanntes Mitglied
jaja,
das mit der Vererbung ist richtig, ich war mir nur nicht sicher, ob dann auch ohne Compilermeckern die Methode von der Superklasse genommen wird, was sich aber durch eine Praxistest bestätigt hat;)

Code:
Inline-Code schreibst du besser mit [ C][ / C]:D
 
Zuletzt bearbeitet:

eMmiE

Bekanntes Mitglied
Das mit dem in-line Code ist so was java-Forum internes

Code:
System.out.println();
ist einfach viel platznehmender, als
Code:
System.out.println();
 

eMmiE

Bekanntes Mitglied
Probier das Ganze einfach mal ohne den Cast zu Collectable
Code:
(Collectable)inventory... -> inventory
Das müsste ja auch funktionieren.

Schon klar, dass der Compiler eigentlich eine ClassCastException ausgeben müsste, aber ich wiß ja nicht, wie BlueJ arbeitet
 

Luukaes

Mitglied
Ah ok, merk ich mir für die Zukunft. :)

Code:
(Collectable)inventory... -> inventory
Ändert leider nichts..
 

eMmiE

Bekanntes Mitglied
Sry, dass ich so blöd war und das übersehen hab:
In deiner if-Anweiseung steht, dass er das getName nur ausgeben soll, wenn das inventory.get(index) == null ist!
Das darf natürlich nicht so sein.

Also: if (!inventory.get(index).equals(null)) {}

Gruß eMmiE
 

Neue Themen


Oben