2010-02-02 37 views
8

¿Es posible, dado solo una interfaz, crear un objeto a partir de esto?Crear objetos desde una interfaz en C#

Algo así como:

var obj = new IWidget(); 

(Sé que este código no es correcto - estancias VS no puede crear una instancia de iwidget)

estoy en un contexto en el que mi proyecto tiene referencias a la interfaces, y quiero crear objetos concretos y devolverlos desde un método, pero no puedo entender cómo crear los objetos puramente desde las interfaces.

+0

sí, pero debe especificar una CoClass COM: http://blogs.msdn.com/brada/archive/2004/10/11/241067.aspx –

+0

@Mark - ¿De dónde obtuvo el COM? –

+0

@Orion - ¿Estás preguntando por qué dije COM CoClass en lugar de solo CoClass? Es un atributo relacionado con la interoperabilidad COM. es decir, no puede usar el atributo CoClass sin el atributo ComImport. –

Respuesta

7

No puede crear un objeto desde una interfaz. Puede crear un objeto a partir de una clase que use esa interfaz.

Por ejemplo:

IList<string> x = new IList<string>(); 

no va a funcionar.

IList<string> x = new List<string>(); 

will.

No se pueden crear interfaces, solo se pueden crear objetos que utilizan la interfaz.

9

Ese código es realmente correcto para los objetos COM, debido a la magia del compilador. Normalmente no es así.

El problema es, ¿cómo se entiende el compilador para saber qué implementación crear? Podría haber cualquier número alrededor. Es posible que desee considerar tener una fábrica para la interfaz o, posiblemente, utilizar una inyección de dependencia (por ejemplo, con Spring.NET o Castle Windsor).

+0

Para obtener una lista completa de contenedores DI, consulte esta pregunta SO http://stackoverflow.com/questions/148908/which-dependency-injection-tool-should-i-use o esta lista http://www.hanselman.com/ blog/ListOfNETDependencyInjectionContainersIOC.aspx – smaclell

0

No sería la respuesta corta. Pero supongo que podrías usar un contenedor IoC para inyectar una implementación.

+0

¿Cómo funciona un contenedor IoC en este caso? (¡Lo siento por las preguntas de los novatos!) – wows

4

Esto no será posible puramente de las interfaces (y no debería ser, ¿qué pasa si hay más de una implementación de la misma?). Parece que lo que quieres hacer es exponer una interfaz, pero no la implementación. ¿Es eso correcto?

Básicamente, usted querría un Factory Pattern. Este patrón implica hacer un método que devuelve la interfaz, pero instancia internamente un tipo concreto. Te permite ocultar el tipo concreto de cualquiera que use la interfaz.

Si va un paso más allá puede usar la Inversión de control (IoC). No sé cuál es la mejor opción para hacer esto en .Net, pero una opción es Spring.Net. Usas un archivo de configuración para definir todas las diferentes configuraciones para tus objetos concretos, y luego haces que el resorte "inyecte" automáticamente esas instancias en tus clases que usan la interfaz.

Cuestiones relacionadas