Ho due classi; chiamiamoli Ogre e Wizard. (Tutti i campi sono pubblici per rendere l'esempio più facile da digitare.)Utilizzo dell'ereditarietà e del polimorfismo per risolvere un problema di gioco comune
public class Ogre
{
int weight;
int height;
int axeLength;
}
public class Wizard
{
int age;
int IQ;
int height;
}
In ogni classe posso creare un metodo chiamato, per esempio, la battaglia() che determinerà chi vincerà se un Ogre incontra e Ogre o un mago incontra un mago. Ecco un esempio. Se un orco incontra un orco, il più pesante vince. Ma se il peso è lo stesso, vince quello con l'ascia più lunga.
public Ogre battle(Ogre o)
{
if (this.height > o.height) return this;
else if (this.height < o.height) return o;
else if (this.axeLength > o.axeLength) return this;
else if (this.axeLength < o.axeLength) return o;
else return this; // default case
}
Possiamo creare un metodo simile per Wizards.
E se un mago incontra un orco? Ovviamente potremmo fare un metodo per questo, confrontando, diciamo, solo le altezze.
public Wizard battle(Ogre o)
{
if (this.height > o.height) return this;
else if (this.height < o.height) return o;
else return this;
}
E ne faremmo uno simile per gli Ogri che incontrano il Wizard. Ma le cose sfuggono di mano se dobbiamo aggiungere più tipi di caratteri al programma.
Questo è il punto in cui mi blocco. Una soluzione ovvia è creare una classe di caratteri con i tratti comuni. Ogre e Wizard ereditano dal personaggio e lo estendono per includere gli altri tratti che definiscono ciascuno.
public class Character
{
int height;
public Character battle(Character c)
{
if (this.height > c.height) return this;
else if (this.height < c.height) return c;
else return this;
}
}
C'è un modo migliore per organizzare le lezioni? Ho esaminato il modello di strategia e il modello di mediazione, ma non sono sicuro di come uno di essi (se presente) potrebbe aiutare qui. Il mio obiettivo è raggiungere una sorta di metodo di battaglia comune, in modo che se un Ogre incontra un Ogre usa la battaglia Ogre-vs-Ogre, ma se un Ogre incontra un Wizard, ne usa uno più generico. Inoltre, cosa succede se i personaggi che si incontrano non condividono tratti comuni? Come possiamo decidere chi vince una battaglia?
Modifica: un sacco di grandi risposte! Devo digerirli e capire quale funziona meglio per la mia situazione.
Quindi vuoi che tutti i 'caratteri' abbiano un gruppo di campi' int', di cui tutti i tratti comuni devono essere confrontati in un certo ordine? – Eric
È possibile inserire una magia/più booleana magica nella classe della procedura guidata –
Si è obbligati ad avere un tipo comune per Ogre e Wizard. Quando li hai confrontati direttamente in pubblico Wizard battle (Ogre o), ad un certo punto si restituisce "o" di tipo Ogre e il metodo si aspetta un Wizard .. A volte naturalmente si viene spinti ad avere una buona gerarchia di oggetti. Ma non è così facile vedere quel fenomeno nei nostri progetti quotidiani. E bella domanda tbw :) –