2016-12-15 3 views
0

Wenn Sie jemals von Nethack gehört haben, sind Sie mit einem solchen Gameplay-Feature wie polymorph vertraut.Java: Eine Variable als Link zur Klasse

In einem Java-Spiel, das ich bin modden, Mobs (Held, Monster) als Java-Klassen angegeben, die alle sehr Basis Char.java Klasse erweitern. Ich versuche, dieser Basisklasse ein neues Feld hinzuzufügen: ein öffentliches Feld current_form, das ein Link zu der Klasse sein soll, die deine aktuelle Form oder die aktuelle Form von Monstern darstellt.

Basis Char.java Klasse würde Attacke(), move(), und einige weitere Verfahren, die current_form.attack auslösen wird(), current_form.move() sind, wobei current_form wird durch Klassenname ersetzt.

Also, wenn ich die Klasse Held haben (erweitert Char):

Hero h = new Hero(); 

und ich angreifen:

h.attack(); 

es wird eine do_attack() Methode als meine aktuelle Form auslösen (sprich: aus einer Klasse benannt als meine aktuelle Form), wenn mein Formular Rat.class ist, löst es Rat.do_attack() jeweils aus.

Wie erreichen Sie diese Art von Verhalten?

+0

Sie haben eine Variable, die sich auf eine entsprechende * Instanz * der Klasse bezieht, die das aktuelle Formular repräsentiert, nicht auf die Klasse. Normalerweise rufen Sie Methoden für diese Instanz auf. Hier gibt es Möglichkeiten für ein Refactoring, aber das würde mehr und größere Änderungen mit sich bringen. –

Antwort

2

Es könnte etwas entlang der Linien von

public class Hero extends Char { 
    Char polymorphedTo; 

    public void attack() { 
     if(polymorphedTo != null) 
      polymorphedTo.attack(); 
     else 
      normalAttackCode(); 
    } 
} 

Dies ermöglicht eine einfache Möglichkeit, alle geeigneten Maßnahmen für die Form, um den Code zu umgeleitet werden, in denen Sie polymorphed.

+0

Wie würden Sie polymorphedTo setzen? Außerdem muss es in der Char-Klasse sein, nicht im Hero, weil jeder Charakter (auch Mobs) polymorph sein kann. –

+0

Wie setzen Sie generell Variablen? Diese Antwort soll Ihnen eine Idee geben, wie es geht. Sie können es in "Char" oder "Hero" oder wo immer es am besten passt. – Kayaman

+0

Setzt du es wie 'Hero.class' oder' Hero.this'? Ich muss aber nicht jedes Mal einen neuen Mob erstellen, wenn ich polymorph bin. –

Verwandte Themen