Posso fare in modo che una classe (fissa) esistente implementi una nuova interfaccia?
-
06-07-2019 - |
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?
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 ...