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
".)
C#, sin embargo, espero que la respuesta sea correcta en todos los oo idiomas. – dotnetdev
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. –