Il modo migliore per strutturare questa classe di pianeti

-4

Questa è più una domanda sulla struttura che sulla codifica. Quindi ho una classe di nome Pianeta e tutti i pianeti hanno i loro modificatori per esempio: è riproducibile? Damageable? ecc. Ho già una classe base per il pianeta, ma non so come lo farò in modo scalabile visto che ho bisogno di verificare se qualche pianeta ha un determinato modificatore.

Classe BasePlanet:

public class BasePlanet {

    private String name;
    private String[] about;
    private long entranceTax;
    private boolean locked, pvp;

    private int minRank;

    private World planetWorld;
    private Location spawn;
    private Material icon;

    public BasePlanet() {
    }

    public BasePlanet(String name, int minRank, long entranceTax,
                      boolean pvp, boolean locked,
                      Material icon, String... about) {
        this.name = name;
        this.about = about;
        this.minRank = minRank;
        this.entranceTax = entranceTax;
        this.locked = locked;
        this.icon = icon;
        this.pvp = pvp;
        this.planetWorld.setPVP(pvp);
    }

    ... Getters and Setters

Implementazione di BasePlanet

public class Mars extends BasePlanet{

    public Mars() {
        super("Mars", 0, 0,
                true,
                false, Material.RED_SANDSTONE,
                "Este planeta contém pedras preciosas",
                "e itens especiais que nenhum outro planeta tem,",
                "ao menos que alguém tenha comercializado até",
                "este pequeno e cheio de surpresas, planeta vermelho."
        );
    }

}

Risolto Dal momento che avevo bisogno di tutti i modificatori per avere un nome e un tipo ho attraversato un modo più semplice e ho appena creato una classe in cui conteneva le 2 proprietà (nome e tipo) e ciascun modificatore è stato esteso da quella classe.

Classe modificatore:

public abstract class Modifier {

    private String name;
    private ModifierType type;

    public Modifier(String name, ModifierType type) {
        this.name = name;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ModifierType getType() {
        return type;
    }

    public void setType(ModifierType type) {
        this.type = type;
    }

    public abstract void apply(Player player);
}

Modificatore di gravità (esempio):

import org.bukkit.entity.Player;

public class Gravity extends Modifier {

    private int gravity;

    public Gravity() {
        super("Gravity", ModifierType.ITEM_NEEDED);
    }

    public void apply(Player player){
        //TODO: apply gravity
    }
}

Per la classe planet ho appena aggiunto una nuova proprietà per memorizzare tutti i modificatori che devono essere inclusi nel pianeta

private List<Modifier> modifiers;
    
posta tommyduarte 24.12.2017 - 18:43
fonte

1 risposta

4

Non hai bisogno di ereditarietà qui. Dal momento che non ne hai bisogno, non usarlo. L'ereditarietà porta le sue complessità e problemi.

Stai già scrivendo una composizione con MaterialType . Non hai creato una classe base diversa per ogni tipo di materiale, perché hai bisogno di farlo con ogni particolare pianeta?

Planets
{
    readonly static Planet MARS = new Planet("Mars", 0, 0, "ect");
    readonly static Planet VENUS = new Planet("VENUS", 0, 0, "ect");
 }

Se hai bisogno di più istanze di un particolare pianeta, puoi avere un tipo di pianeta.

PlanetInstance
{
     PlanetType typeOfPlanet;
}

Planet mars1 = new PlanetInstance(PlanetType.MARS, "ect");
    
risposta data 24.12.2017 - 21:48
fonte

Leggi altre domande sui tag