Recentemente ho fatto una domanda su classi Java che implementano metodi da due fonti (tipo come ereditarietà multipla). Tuttavia, è stato sottolineato che questo tipo di necessità può essere un segno di un difetto di progettazione. Quindi, probabilmente è meglio indirizzare il mio attuale design piuttosto che provare a simulare l'ereditarietà multipla.
Prima di affrontare il problema attuale, alcune informazioni di base su una particolare meccanica in questo framework:
È un semplice framework di sviluppo del gioco. Diversi componenti allocano memoria (come i dati dei pixel), ed è necessario eliminarli non appena non ne hai bisogno. Gli sprite sono un esempio di questo.
Ad ogni modo, ho deciso di implementare qualcosa come Manual-Reference-Counting from Objective-C. Alcune classi, come gli Sprites, contengono un contatore interno, che viene aumentato quando chiami retain()
e diminuito su release()
.
Così è stata creata la classe astratta Resource
. Qualsiasi sottoclasse di questo otterrà gratuitamente le implementazioni retain()
e release()
. Quando il suo conteggio raggiunge 0 (nessuno sta usando questa classe), chiamerà il metodo destroy()
. La sottoclasse deve solo implementare destroy()
.
Questo perché non voglio fare affidamento su Garbage Collector per eliminare i dati pixel inutilizzati.
Gli oggetti di gioco sono tutte sottoclassi della classe Node - che è il blocco di costruzione principale, in quanto fornisce informazioni come posizione, dimensione, rotazione, ecc.
Vedi,dueclassisonousatespessonelmiogioco.SpritesandLabels.
Ah...maaspetta.Glispritecontengonodatipixel,ricordi?Ecometale,hannobisognodiestendereResource
.
Ma questo, ovviamente, non può essere fatto. Gli sprite sono nodi, quindi devono sottoclasse Node
. Ma diamine, sono anche risorse.
- Perché non creare un'interfaccia Resource?
-
Perché dovrei reimplementare
retain()
erelease()
. Sto evitando questo in virtù del fatto che non scrivo più volte lo stesso codice (ricorda che ci sono più classi che hanno bisogno di questo sistema di gestione della memoria). -
Perché non la composizione?
- Perché dovrei ancora implementare metodi in
Sprite
(e classi simili) che chiamano essenzialmente i metodi diResource
. Scriverò ancora lo stesso codice ancora e ancora!
Qual è il tuo consiglio in questa situazione, quindi?