Interfaz de instanciación vs instanciación de clase

¿Podría alguien ayudarme a entender si los siguientes códigos son los mismos? Si no es así, ¿cuál es la diferencia entre la clase y la instanciación de interferencia?

IUnityContainer container = new UnityContainer() UnityContainer container = new UnityContainer() 

Según tengo entendido, Inteface solo tiene la firma del método y si la interfaz ha sido implementada por 3 clases. No estoy seguro de cuál de las 3 instancias se crearía con la primera statement anterior.

Gracias.

Las interfaces no pueden ser instanciadas por definición. Siempre instancias una clase concreta.

Entonces, en ambas declaraciones su instancia es en realidad de tipo UnityContainer .

La diferencia está en la primera statement, en lo que respecta a C #, su container es algo que implementa IUnityContainer , que podría tener una API diferente de UnityContainer .


Considerar:

 interface IAnimal { void die(); } class Cat : IAnimal { void die() { ... } void meow() { ... } } 

Ahora :

 IAnimal anAnimal = new Cat(); Cat aCat= new Cat(); 

C # sabe con certeza que anAnimal.die() funciona, porque die() está definido en IAnimal . Pero no te permitirá hacer anAnimal.meow() aunque sea un Cat , mientras que aCat puede invocar ambos métodos.

Cuando usa la interfaz como su tipo, de alguna manera, está perdiendo información.

Sin embargo, si tenía otra clase de Dog que también implementa IAnimal , su anAnimal podría hacer referencia a una instancia de Dog . Ese es el poder de una interfaz; Puedes darles cualquier clase que lo implemente.

Realmente no existe tal cosa como “instanciación de interfaz”, pero hay variables de interfaz. La primera línea es un ejemplo de una de estas variables.

Con la primera línea, podría crear una instancia de container para cualquier clase concreta que implemente IUnityContainer . Con la segunda línea, el objeto container solo se podría crear una instancia de la clase UnityContainer o una clase derivada.

Cuando utiliza variables de interfaz en su código, le permite cambiar más fácilmente la implementación concreta, lo que hace que su código sea más flexible.

El comstackdor considera que el objeto creado y almacenado en la variable de IUnityContainer container tiene solo los miembros definidos en la interfaz de IUnityContainer . Es decir, si la clase UnityContainer contiene miembros que no están definidos por la interfaz IUnityContainer , no podrá invocarlos. Por otro lado, podría “poner” cualquier objeto que implemente la interfaz IUnityContainer en la variable de IUnityContainer container , no solo las instancias de UnityContainer . Con la segunda statement, está atascado con instancias de UnityContainer y objetos en su jerarquía de herencia.

Consulte la Guía de progtwigción de C # para interfaces para obtener más información sobre las interfaces y cómo se utilizan.

La instanciación de la interfaz no es posible. Pero cuando creamos un objeto para la interfaz utilizando su clase implementada, funciona.

 IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class. UnityContainer container = new UnityContainer() // To access directly by using like this. 

Supongamos que hay una herencia múltiple, para lograr esto necesitamos ir primero.

No hay necesidad de proporcionar tales cosas que vamos con la segunda manera.

Las interfaces restringen el acceso directo de los datos y los miembros de su clase.