Entrambe le direzioni sono consentite in Java e C#. Downcasting richiede un cast esplicito e può generare un'eccezione se l'oggetto non è del tipo corretto. L'upcasting, tuttavia, non ha bisogno di cast esplicito ed è sempre sicuro.
vale a dire, a patto di avere public interface Animal
e due implementazioni di questo interface
, Cat
e 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
e si vorrà un try
/catch
intorno ai cast espliciti. In C# si ha la utili as
parola chiave:
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
Nessuna eccezione saranno gettati, e miocane sarà non nullo e myPet sarà nullo. Java non ha una parola chiave equivalente sebbene sia sempre possibile utilizzare i test if (meowAnimal instanceof Dog)
per mantenere la sicurezza del tipo. (Direi che il "as
" parola chiave genera bytecode che fa il caso, assegnando nulla della is
fallisce. Ma forse NET ha un'istruzione bytecode che fa l'equivalente di "as
".)
C#, tuttavia mi aspetto che la risposta sia corretta in tutte le lingue oo. – dotnetdev
Questo tipo di cose è probabilmente simile nelle lingue OO, ma non necessariamente identico. Passare a C# in modo che possiamo fornire una risposta specifica per te. –