Les deux directions sont autorisées en Java et C#. La diffusion vers le bas nécessite une distribution explicite et peut lancer une exception si l'objet n'est pas du bon type. La prévision, cependant, n'a pas besoin de distribution explicite et est toujours sûre à faire.
qui est, en supposant que vous avez public interface Animal
et deux implémentations de ce interface
, Cat
et 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
et vous aurez besoin d'un try
/catch
autour des moulages explicites. En C#, vous avez le mot-clé as
utile:
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
Aucune exception sera levée, et monChien serez et non nulle mypet sera nulle. Java n'a pas de mot-clé équivalent bien que vous puissiez toujours utiliser les tests if (meowAnimal instanceof Dog)
pour conserver la sécurité du type. (Je suppose que le mot-clé « as
» génère bytecode qui fait le cas, l'attribution nulle de l'is
échoue. Mais peut-être .NET a une instruction de bytecode qui fait l'équivalent de « as
».)
C#, mais je m'attends à ce que la réponse soit correcte dans tous les langages oo. – dotnetdev
Ce genre de chose est susceptible d'être similaire dans tous les langages OO, mais pas nécessairement identiques. Scoping to C# afin que nous puissions vous fournir une réponse spécifique. –