Java: accesso ai metodi dei campi degli oggetti

0

Sto progettando un gioco di ruolo. In questi giochi c'è un personaggio che ha un livello. Ho scoperto che il livello stesso è un oggetto. Ha valori come l'esperienza, la conoscenza di quanto sia necessaria l'esperienza moch per un livello e metodi come improve () o gainExperience (). Quindi il personaggio dovrebbe avere un oggetto di livello. Un oggetto di gioco potrebbe avere un metodo di combattimento. Quando il personaggio vince un combattimento, guadagna esperienza. L'oggetto del gioco ha accesso all'oggetto giocatore. Ma il problema ora è: tutti i campi dovrebbero essere privati. Quindi dovrei scrivere un getter per far sì che l'oggetto di livello aumenti l'esperienza che mi sembra un codice inopportuno. È un modo accettato per impostare il campo di livello dell'oggetto carattere e accedervi in questo modo:

player.level.gainExperience(value);

o c'è un modo migliore per accedere ai metodi dei campi che sono anche oggetti?

Modifica La mia domanda è diversa da questo . Mentre la domanda citata è molto generica, la mia si riferisce ad un esempio concreto, che limita le possibilità di risposta, e rende la risposta più semplice e chiara

    
posta Henry Weinert 12.02.2018 - 12:47
fonte

2 risposte

4

Una possibile risposta sarebbe quella di definire lo stesso metodo sul giocatore e delegare all'oggetto "livello":

player.gainExperience(value);

public final class Player {
    private final Level level;
    ...
    public void gainExperience(int value) {
        level.gainExperience(value);
    }
}

Dovresti cercare di evitare di introdurre "getters" il più possibile, e anche se pensi che non sia possibile, provaci ancora una volta. Raccoglierai i benefici più tardi.

    
risposta data 12.02.2018 - 14:05
fonte
1

Vuoi rendere il tuo oggetto Fight il più semplice possibile. Se sa che alcuni partecipanti alla lotta sono giocatori, e i giocatori hanno livelli e livelli conosciuti dell'esperienza ecc., La sua complessità si sta complicando.

Ma da qualche parte nel tuo codice, qualcosa deve sapere queste cose. Non vorrei perdere il sonno:

Main()
{
    var winner = Fight.WhoWins(player, monster1, monster2);
    if(winner == player)
    {
        player.level.gainExperience(100);
    }
}

È quando quell'accesso all'oggetto figlio è sepolto in profondità nel grafico dell'oggetto che diventa ovviamente utile non esporlo. ad esempio

Attack(target)
{
     if(target.body.hitpoints < this.attacker.weapon.stats.damage)
     //what about attacking objects?
     //what about unarmed attacks?
     {
         this.attacker.level.gainExperiece(target.monsterType.expValue);
         //what if the attacker isnt a player and thus hasnt got a level?
         //what if the target isnt a monster
     }
}
    
risposta data 12.02.2018 - 14:36
fonte

Leggi altre domande sui tag