Pregunta

Tengo la sensación de que ya sé la respuesta que las personas darán, pero aquí va de todos modos:

Digamos que estoy escribiendo una nueva clase, llamémosla PooledQueue<T>, en cuyo constructor quiero aceptar un argumento que implementa la interfaz IResourcePool<T>. La idea aquí es que estoy bien con el uso de cualquier objeto de grupo subyacente, siempre que me dé las propiedades / métodos de <=> (ya sabes, toda la idea detrás de las interfaces, ¿verdad?).

Pero si hay ya una clase disponible que proporciona toda la funcionalidad de <=>, excepto que no implementa <=> (y no puedo modificar el código fuente), ¿hay alguna forma de forzar la implementación?

Lo que espero que la gente responda es que debería hacer un contenedor para la clase existente que implementa la interfaz necesaria. Pero preferiría poder hacer esto:

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

en lugar de esto:

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

Creo que lo que creo que sería realmente útil es si la implementación de una interfaz de una clase se pudiera definir por separado de la definición de la clase. Algo así como se estructura una base de datos bien diseñada, con tablas de asociación que vinculan entidades con ID de otras tablas. ¿Tiene sentido eso?

¿Fue útil?

Solución

Fuera de la caja, no puede forzar una interfaz en una clase sin heredar de ella.

Hay formas, como el uso de un RealProxy o bibliotecas de terceros, como LinFU , que le permiten para simular cosas como esta, pero a un costo mayor que hacer tu clase de envoltura.

De hecho, podría crear un constructor de sobrecarga que cree el contenedor para usted, de modo que el código permanezca limpio ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top