Come dovrei & # 8220; costruire & # 8221; cose ora ho implementato il polimorfismo? (Java, gioco sim)

StackOverflow https://stackoverflow.com/questions/1219943

Domanda

Sto lavorando a un piccolo gioco Java che è una sorta di clone del gioco Theme Hospital del 1995. Di recente ho lavorato sulla GUI e sulla struttura dei livelli ora ho il percorso di ricerca e il funzionamento della griglia. Il mio modo attuale di "costruire cose" è composto da una stanza e un banco della reception e finora funziona bene, ma devo implementare un modo per aggiungere diversi tipi di stanze ed elementi. Ecco il mio codice attuale sul pulsante premere per la creazione dell'oggetto ( http://snipt.org/lUm).

Sono sicuro che ci deve essere un modo migliore per farlo! La mia implementazione è scarsa, lo so, ma solo di recente ho iniziato a capire come utilizzare le classi e le interfacce astratte.

In realtà impostando le proprietà della stanza o dell'oggetto, al momento non ho problemi. Sto pensando al futuro, ma adoro come ottenere opinioni diverse sul modo migliore di fare le cose qui su Stack. A idee su come una cosa del genere dovrebbe essere realizzata? Qualche esempio di questo genere di cose? Vorrei cercarlo, ma non sono davvero sicuro di cosa cercare, in quanto non lo so se quello che sto facendo ha un nome esatto.

Mi dispiace se non sono stato troppo chiaro esattamente di cosa sto parlando. Sarò lieto di rispondere a qualsiasi ulteriore domanda al riguardo e di caricare più sezioni di codice in base alle necessità o richieste.

Grazie in anticipo per il tuo tempo e pensieri!

È stato utile?

Soluzione

Dai un'occhiata al modello di fabbrica . La fabbrica è un mezzo per creare oggetti fornendo parametri e recuperando oggetti che aderiscono a un'interfaccia comune. L'implementazione, tuttavia, è determinata dalla fabbrica. Il codice chiamante non deve saperlo.

Incapsulando la costruzione dell'oggetto in un altro oggetto (la fabbrica), la meccanica di selezione dell'oggetto particolare da costruire viene sottratta al codice chiamante. Puoi facilmente fornire ulteriori sottoclassi in un secondo momento modificando solo la fabbrica stessa.

Quindi nel tuo codice di esempio, il metodo buildMe () è una forma di factory. Sono necessari alcuni parametri che specificano cosa è necessario creare: un Room o un ReceptionDesk . Entrambi implementerebbero la stessa interfaccia (un HospitalComponent ?) E il codice chiamante posizionerebbe quel componente all'interno dell'ospedale. È possibile aggiungere ulteriori sottoclassi di HospitalComponent alla fabbrica (un OperatingTheatre ?) E il codice chiamante non deve cambiare.

Vale la pena indagare modelli di progettazione (in questo scenario, controlla questo elenco di schemi creazionali ) per comprendere i diversi modi di utilizzare gli oggetti per risolvere problemi comuni e per come per comunicare le tue soluzioni con altre persone. Il Gang-of-Four è la bibbia di questo argomento.

Altri suggerimenti

Il polimorfismo potrebbe essere eccessivo per quello che stai facendo.

Personalmente, avrei solo una classe Room, con una tabella dei valori per ogni edificio (dimensione massima, costo per piastrella ecc.). Quindi, quando crei una nuova stanza, ottieni la voce della tabella corrispondente e crea l'oggetto Room con i dettagli della tabella.

Questa potrebbe non essere la migliore pratica e probabilmente va contro le convenzioni Java (sono arrivato a Java da linguaggi dinamici) ma in termini di righe di codice che devono essere cambiate per creare una nuova stanza, è la più bassa che ho trovato .

Quello che hai ora è una classe con un sacco di funzioni statiche. Non è molto OOP: la classe è solo un modo per raggruppare tutte le funzioni in un unico file.

Se segui il percorso OOP, vorresti una classe base Room, quindi OperatingRoom, ReceptionistDesk, Bathroom, Office (for Staff), MRIRoom, WaitingRoom e forse anche Hall sarebbero classi secondarie di Room.

public class Room {
    protected int width, length;  //how many squares wide/long the room is

    protected int x, y;  //where it is on the gride

    protected float buildingProgress;  //how far construction has come

    protected bool isReady;  //is the building ready for use?

    protected Person occupants[];  //some list/array of people currently in the room

    protected Person resident;  //the person 'in charge' in the room--the receptionist, manager, MRI technician, etc etc.
}

Penserei attentamente prima di modellare questo problema con il polimorfismo.

La domanda è: quale comportamento fondamentalmente diverso mostrerà ogni tipo di Sala? Cosa c'è di comune tra tutti loro?

Il polimorfismo non è sempre la risposta. La composizione a volte può mantenere le cose più flessibili. Una soluzione basata sui dati, come raccomandato in precedenza, potrebbe essere la migliore di tutte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top