2016-04-09 7 views
0

Also noch einmal, sorry diese questian beantwortet werden könnten/fragte allready viel, aber ich bin nicht wirklich sicher, was ich fürÄnderung Art von Objekt je nach Methode Argumente

bin auf der Suche bin ich zur Zeit einen Mod machen für ein Spiel und müssen benutzerdefinierte Elemente registrieren, die ich erstellt habe. Ich habe benutzerdefinierte Klassen für jeden Elementtyp erstellt, die verschiedene Variablen enthalten, auf die ich zugreifen muss. Das Problem ist, die Klasse (n), von denen sie alle erben, haben diese Variablen/Daten nicht.

Mein erster Versuch war so etwas wie diese (pseudo code'ish)

public void addItem(Item itemc) 
{ 
    Object item = null; 
    if (itemc.getClass().equals(ItemTool)) 
      item = (ItemTool) itemc; 
     if (itemc.getClass().equals(ItemFood)) 
      item = (ItemFood) itemc; 
     .......etc.......... 

    registerItem(item,item.name); 
    registerItemRenderer(item,item.meta,item.model); 
} 

Aber das funktioniert nicht und ich erhalte eine Fehlermeldung, Punkt (behandelt als Objekt als initialisiert) nicht über diese Mitglieder .

Im Moment habe ich nur die Methode addItem überladen, um jede benutzerdefinierte Elementklasse zu akzeptieren (über 10 atm), aber das ist nicht wirklich das, was ich will.

Gibt es eine Möglichkeit, den Typ eines Objekts in jede Klasse zu ändern, die ich als Argument übergeben werde, und dann damit arbeiten?

Antwort

0

Sie könnten die Extraktion von item.name in die if bewegen:

Object item = null; 
Object itemName = null; 

if (itemc.getClass().equals(ItemTool)) { 
    item = (ItemTool) itemc; 
    itemName = item.name; 
} else { 
    if (itemc.getClass().equals(ItemFood)) { 
     item = (ItemFood) itemc; 
     itemName = item.name; 
    } 
} 

registerItem(item, itemName); 

aber es wäre viel mehr OO-like sein, um eine Interface zu schaffen für Item ein getName -Verfahren einschließen, die alle Item implementiert und Ihre Methode muss nicht wissen, welche Art Ihr Artikel ist, den Namen zu erhalten:

public void addItem(Item item) { 
    registerItem(item, item.getName()); 
} 
+0

Da ich das eigentlich Spiel-Dateien nicht ändern kann (das ist die Item-Klasse gehört) Ich kann keine Schnittstelle für Artikel erstellen. Ich könnte möglicherweise die Item-Klasse klonen und die Schnittstelle implementieren, aber da Item ziemlich "weit unten" in der Vererbung ist, müsste ich viele andere Klassen klonen, was nicht das ist, was ich will erste Methode - die immer noch ziemlich "hässlich" ist, aber es funktioniert. Danke –

+0

Wenn du die Spieldateien nicht ändern kannst, könntest du zumindest ein neues 'GameItem' erstellen, das Elemente kapselt, wenn du ein Verhalten basierend auf der' Item' Klasse in mehr Situationen als nur dem oben genannten senden musst "Adapter" -Muster. – Smutje

Verwandte Themen