Struttura dei dati più efficiente per l'implementazione della struttura di ereditarietà senza classi

0

Ho un numero di tipi che si riferiscono tutti gli uni agli altri in termini di "essere derivati" l'uno dall'altro. Avrei bisogno di un modo per fare relazioni is , il che mi ha fatto pensare inizialmente alle classi, ma mi sono reso conto che oltre alle relazioni is , non ci sarebbe alcun motivo per usare le classi dato che ogni 'tipo' di dati funziona allo stesso modo. Avevo anche pensato alle enumerazioni, ma poiché non c'è modo di estendere o ereditare dalle enumerazioni è stata una scelta sbagliata.

Per contesto (questo è il mio esempio specifico): Ho un certo numero di diversi tipi di risorse che sono tutti 'tipi' in modo che possano essere usati insieme a un int per indicare quanta parte di quella risorsa è disponibile. Ho diversi tipi di queste risorse, come alimenti, metalli, materiali da costruzione, ecc. All'interno della categoria alimentare ci sarà qualcosa come grano o mais; sotto i metalli ci sarebbero rame, ferro, oro ecc. Dal momento che tutti questi sono ancora solo "risorse" e non hanno altre funzionalità oltre alla digitazione, sembra inutile usare le classi e l'ereditarietà OO.

Come implementerei questo tipo di dati senza ricorrere all'utilizzo delle classi?

    
posta Garan 07.03.2014 - 15:06
fonte

2 risposte

3

Se non ci sono funzioni da ereditare, la composizione delle strutture potrebbe essere più favorevole dell'ereditarietà delle classi. Il concetto di "composizione sull'ereditarietà" può essere applicato qui, vedi:

Wikipedia

SO popolare Rispondi a questo problema

Sebbene gli esempi precedenti utilizzino le classi, un'implementazione alternativa potrebbe utilizzare struct:

Composizione con le strutture C

    
risposta data 07.03.2014 - 15:12
fonte
0

Ciò che hai descritto è molto possibile senza controllare le relazioni is .

Una progettazione orientata agli oggetti dovrebbe fare affidamento sulle interfacce, non sulle implementazioni. Ciò significa, codice come questo:

if (o is Derived1)
{
    do_something_with_derived1(o);
} 
else if (o is Derived2)
{
    do_something_with_derived2(o);
} 

Dovrebbe essere trasformato in

o.do_something_virtual(context);

In sostanza, trasferisci la responsabilità di "fare qualcosa" dal chiamante al chiamato. Il chiamante attiva solo questa azione. Il callee conosce il proprio tipo e può agire di conseguenza. Se esiste un qualsiasi contesto nel sito chiamante che si utilizzerà nell'operazione, lo si passa come parametro.

La chiave qui è il metodo virtuale, che consente una spedizione dinamica. Ciò rimuove la strong dipendenza da ogni implementazione e il codice di "verifica del tipo" sul sito di chiamata. Il sito chiamante può persino chiamare implementazioni future.

Un altro approccio possibile è un progetto basato sui dati. I sistemi Entity Component sono una soluzione flessibile che può essere utilizzata per evitare complicate gerarchie di classi quando ogni classe base aggiungeva solo un po ' di funzionalità (nel tuo esempio: il tipo e la quantità di risorse).

    
risposta data 07.03.2014 - 15:23
fonte

Leggi altre domande sui tag