# Java -BlueJ -MUD



## Luukaes (23. Nov 2013)

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:


```
/**
     * 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 
	
	
	
	





```
(Collectable)inventory.getCollectables().get(index).getName())
```
ist der Knackpunkt und hier das 
	
	
	
	





```
getName()
```
die Methode 
	
	
	
	





```
getCollectables()
```
 aus 
	
	
	
	





```
inventory
```
 gibt hier eine arrylist wieder (
	
	
	
	





```
/**
     * Gibt die Liste der collectables in einem Inventar zurueck.
     */
     public ArrayList getCollectables() {
        return collectables;
    }
```
)

```
get(index)
```
 sollte dann ja den Speciherot an der Stelle index zurückgeben und das ist dann ja ein "collectable" auf dem wir 
	
	
	
	





```
getName()
```
 aufrufen.

```
getName()
```
 ist in "Subject" definiert, von dem "Item" erbet, von dem "Collectable" erbt, also sollte man auf einem "collectable" auch die Methode 
	
	
	
	





```
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!


----------



## eMmiE (23. Nov 2013)

Hi,


```
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 (23. Nov 2013)

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


----------



## eMmiE (23. Nov 2013)

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


----------



## Luukaes (23. Nov 2013)

> 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 (23. Nov 2013)

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


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


----------



## eMmiE (23. Nov 2013)

Meinte der Compiler vllt. room.getName()?


----------



## Luukaes (23. Nov 2013)

Nein, es wurde genau das beschriebene getName() markiert.
Was meinst du mit in-line code?


----------



## eMmiE (24. Nov 2013)

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


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

```
System.out.println();
```


----------



## eMmiE (24. Nov 2013)

Probier das Ganze einfach mal ohne den Cast zu Collectable

```
(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 (24. Nov 2013)

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


```
(Collectable)inventory... -> inventory
```
Ändert leider nichts..


----------



## eMmiE (26. Nov 2013)

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


----------

