c# - que - interfaz de audio o mixer
¿Conectar la interfaz a su objeto de implementación concreto o viceversa? (5)
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?
¿Cuáles son las reglas en este caso?
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 querrás try
/ catch
los moldes explícitos. En C # tiene la palabra clave útil:
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
No se lanzará ninguna excepción, y myDog será no nulo y myPet será nulo. Java no tiene una palabra clave equivalente, aunque siempre puede usar las if (meowAnimal instanceof Dog)
para mantener la seguridad del tipo. (Supongo que la palabra clave " as
" genera un código de bytes que hace que el si, la asignación de nulo is
fallida. Pero tal vez .NET tiene una instrucción de código de bytes que hace el equivalente de " as
").
Ambos son válidos, considerando que es un elenco 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.
En la mayoría de los idiomas, puedes transmitir 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 quieres 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.
Si estás hablando de Java (pero las reglas para otros lenguajes son similares), es así:
Puede (abajo) transmitir una interfaz a una implementación concreta, si la referencia que usted emite 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 como ClassCastException
en Java.
Puede actualizar una implementación concreta de una interfaz a la interfaz libremente.
Una interfaz puede ser toda la clase, si no es necesario, 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.