2009-02-12 9 views
28

En C#, cuando tengo una interfaz y varias implementaciones concretas, ¿puedo convertir la interfaz a un tipo concreto o es de tipo concreto para la interfaz?¿Interfaz Cast para su objeto de implementación concreto o viceversa?

¿Cuáles son las reglas en este caso?

+0

C#, sin embargo, espero que la respuesta sea correcta en todos los oo idiomas. – dotnetdev

+0

Este tipo de cosas es probable que sea similar en todos los lenguajes OO, pero no necesariamente idénticos. El alcance a C# para que podamos brindarle una respuesta específica. –

Respuesta

33

Ambas direcciones están permitidas en Java y C#. Downcasting necesita un lanzamiento explícito y puede arrojar una excepción si el objeto no es del tipo correcto. Upcasting, sin embargo, no necesita un lanzamiento explícito y siempre es seguro hacerlo.

Es decir, suponiendo que tiene public interface Animal y dos implementaciones de esta interface, Cat y Dog ....

Animal meowAnimal = new Cat(); // No cast required 
Animal barkAnimal = new Dog(); // No cast required 

Cat myCat = (Cat) meowAnimal; // Explicit cast needed 
Dog myDog = (Dog) barkAnimal; // Explicit cast needed 

Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception 

y usted querrá un try/catch alrededor de las conversiones explícitas. En C# que tiene la utilidad as palabra clave:

Dog myDog = barkAnimal as Dog; 
Dog myPet = meowAnimal as Dog; 

Sin excepción serán arrojados, y mydog será no nulo y mypet será nulo. Java no tiene una palabra clave equivalente, aunque siempre puede usar las pruebas if (meowAnimal instanceof Dog) para mantener el tipo de seguridad. (Yo supongo que la "as" palabra clave genera código de bytes que hace el caso, la asignación de nulo de la is falla. Pero tal vez .NET tiene una instrucción de código de bytes que hace el equivalente de "as".)

+1

¿Qué pasa con "es": si (meowAnimal es perro) {Perro d = (Perro) meowAnimal} –

+0

También puede utilizar la palabra clave "es" para evitar excepciones de lanzamiento. – Eddie

+8

haciendo un yeso 'como' y un cheque nulo es preferible a un cheque 'es' y un yeso explícito mientras termina lanzando dos veces, una para el is que devuelve verdadero o falso y luego una vez para el reparto explícito ((Dog) animal). –

0

Ambos son válidos, considerando que es un modelo lógico. Muchas veces, los consumidores de su interfaz no tienen acceso a las clases concretas, que es una razón importante para tener una interfaz en primer lugar.

3

Si estamos hablando acerca de Java (pero las reglas para otros idiomas son similares), es la siguiente:

puedes (hacia abajo) emitir una interfaz para una aplicación concreta, si y sólo si la referencia que lances en realidad es una referencia a la implementación concreta específica. Eso significa

Vehicle v=new Car(); 
(Car)v // this is OK 
(Bus)v // this is not 

El error se manifiesta a sí misma como ClassCastException en Java.

Puede actualizar libremente una implementación concreta de una interfaz a la interfaz.

+0

He localizado la pregunta original en C#, por lo que su respuesta ya no es relevante. Lo siento. –

13

En la mayoría de los idiomas, puede transmitir en ambas direcciones. Si tiene una clase concreta, puede transmitirla a la interfaz. Si tiene una interfaz, es posible convertirla a la clase concreta.

Generalmente, solo quiere ir en la primera dirección. La razón es que no debe saber cuál es la clase concreta cuando solo tiene un puntero a la interfaz. Si está pasando algo como una interfaz, debería poder hacer lo que necesite desde esa interfaz. Si se ve en la necesidad de usar partes del objeto concreto que no están en la interfaz, tiene un problema de diseño que debe solucionarse en lugar de fundir.

+0

¿Qué hay de WPF? ¿Qué sucede si recupero las interfaces de un servicio y necesito convertirlas en ViewModels para vincular una interfaz de usuario de WPF? – Darkonekt

0

Una interfaz puede sea la clase completa, si no tiene que ser ser, es mejor cuando crea un constructor que acepta la interfaz como parámetro y copia la configuración, de esta manera usted tiene control sobre lo que sucede y lo que se necesita.

Cuestiones relacionadas