Lorsqu'une classe doît utiliser le code d'une autre classe, sans
pour autant hériter de son type, il convient d'utiliser la délégation.
Un exemple typique est la réalisation d'un classe StringList
qui ne doît contenir que des objets de type String, et qui
utilise pour son implémentation la classe CList qui contient
des objets de type Object. StringList ne peut hériter de
CList
car alors, elle devrait pouvoir utiliser toutes les méthodes de
CList (à cause de l'héritage de type), ce qui signifie
par exemple que l'on peut rajouter des Object à une StringList
même s'ils ne sont pas des String. Un test du type réel
de l'objet à insérer peut bien sûr être effectué
dans la méthode StringList.insert(Object), grâce
à l'opérateur instanceof, mais c'est une solution
peu satisfaisante.
D'autre part, les méthodes ne faisant pas intervenir le type
des objets contenus sont communes aux StringList et aux CList.
Ceci peut être explicite et utilisé en créant une interface
qui déclare ces méthodes et est implémentée
à la fois par CList et StringList. En fait, cette
interface décrit un type "Liste avec curseur". Pour des raisons
d'usage, nous appellerons donc cette interface CList et l'ancienne
CList
sera renommée en ObjectList.