Domanda

Ho la sensazione di sapere già la risposta che la gente darà, ma qui va comunque:

Supponi di scrivere una nuova classe, chiamiamola PooledQueue<T>, nel costruttore della quale voglio accettare un argomento che implementa l'interfaccia IResourcePool<T>. L'idea qui è che sto bene usando qualsiasi oggetto pool sottostante, purché mi dia le proprietà / metodi di <=> (sai, l'intera idea dietro le interfacce, giusto?).

Ma se c'è già una classe disponibile che fornisce tutte le funzionalità di <=>, tranne per il fatto che non implementa <=> (e non posso modificare il codice sorgente), c'è un modo per forzare l'implementazione?

Quello che mi aspetto che le persone rispondano è che dovrei semplicemente creare un wrapper per la classe esistente che implementa l'interfaccia necessaria. Ma preferirei solo essere in grado di farlo:

// GetDataPool returns an object of type Pool<Data> that I can't modify
var q = new PooledQueue<Data>(GetDataPool());

invece di questo:

var q = new PooledQueue<Data>(new PoolWrapper<Data>(GetDataPool()));

Suppongo che ciò che ritengo possa essere davvero utile se l'implementazione di una classe di un'interfaccia potesse essere definita separatamente dalla definizione della classe. Ordinamento del modo in cui è strutturato un database ben progettato, con tabelle di associazione che collegano entità con ID di altre tabelle. Ha senso?

È stato utile?

Soluzione

All'improvviso, non è possibile forzare un'interfaccia su una classe senza ereditarla.

Esistono modi, come l'utilizzo di un RealProxy o librerie di terze parti come LinFU , che ti consentono per simulare cose come questa, ma a un costo superiore rispetto alla creazione della classe wrapper.

In effetti, potresti creare un costruttore di overload che crea il wrapper per te, in modo che il codice rimanga pulito ...

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