La descente est parfois nécessaire et appropriée. En particulier, cela est souvent approprié dans les cas où l'on a des objets qui peuvent ou non avoir une certaine capacité, et on souhaite utiliser cette capacité lorsqu'elle existe tout en manipulant des objets sans cette capacité d'une manière par défaut. À titre d'exemple simple, supposons que l' String
on demande à a s'il est égal à un autre objet arbitraire. Pour que l'un soit String
égal à un autre String
, il doit examiner la longueur et le tableau de caractères de support de l'autre chaîne. Si String
on demande à a s'il est égal à a Dog
, cependant, il ne peut pas accéder à la longueur de Dog
, mais il ne devrait pas avoir à le faire; au lieu de cela, si l'objet auquel a String
est censé se comparer n'est pas unString
, la comparaison doit utiliser un comportement par défaut (signalant que l'autre objet n'est pas égal).
Le moment où la descente doit être considéré comme le plus douteux est celui où l'objet projeté est "connu" pour être du type approprié. En général, si un objet est connu pour être un Cat
, il faut utiliser une variable de type Cat
, plutôt qu'une variable de type Animal
, pour s'y référer. Il y a des moments où cela ne fonctionne pas toujours, cependant. Par exemple, une Zoo
collection peut contenir des paires d'objets dans des emplacements de tableau pairs / impairs, en s'attendant à ce que les objets de chaque paire puissent agir les uns sur les autres, même s'ils ne peuvent pas agir sur les objets des autres paires. Dans un tel cas, les objets de chaque paire devraient toujours accepter un type de paramètre non spécifique de sorte qu'ils pourraient, syntaxiquement , transmettre les objets de toute autre paire. Ainsi, même si Cat
l »playWith(Animal other)
La méthode ne fonctionnerait que lorsque other
était un Cat
, le Zoo
devrait avoir la possibilité de lui passer un élément d'un Animal[]
, donc son type de paramètre devrait être Animal
plutôt que Cat
.
Dans les cas où la descente est légitimement inévitable, il faut l'utiliser sans scrupule. La question clé est de déterminer quand on peut sensiblement éviter la descente, et de l'éviter quand c'est raisonnablement possible.