Utilisation de implements pour la délégation
Remonter à Réutilisation de code et délégation
De nombreuses classes ont des propriétés qui sont des sous-objets. Vous pouvez également utiliser des interfaces comme type d'une propriété. Quand une propriété est de type interface (ou d'un type de classe qui implémente les méthodes d'une interface), vous pouvez utiliser le mot clé implements
pour spécifier que les méthodes de cette interface sont déléguées à la référence d'objet ou d'interface qui est la valeur de la propriété. Le délégué doit seulement fournir l'implémentation des méthodes. Il n'a pas besoin de déclarer qu'il gère l'interface. La classe contenant la propriété doit inclure l'interface dans sa liste d'ancêtres.
Par défaut, l'utilisation du mot clé implements
délègue toutes les méthodes d'interface. Vous pouvez néanmoins utiliser les clauses de résolution des méthodes ou déclarer des méthodes dans votre classe qui implémentent certaines des méthodes de l'interface pour redéfinir ce comportement par défaut.
L'exemple suivant utilise le mot clé implements
dans la conception d'un objet adaptateur de couleurs qui convertit une valeur de couleur RVB sur 8 bits en une référence Color :
unit cadapt; interface type IRGB8bit = interface ['{1d76360a-f4f5-11d1-87d4-00c04fb17199}'] function Red: Byte; function Green: Byte; function Blue: Byte; end; IColorRef = interface ['{1d76360b-f4f5-11d1-87d4-00c04fb17199}'] function Color: Integer; end; { TRGB8ColorRefAdapter associe un IRGB8bit à un IColorRef } TRGB8ColorRefAdapter = class(TInterfacedObject, IRGB8bit, IColorRef) private FRGB8bit: IRGB8bit; FPalRelative: Boolean; public constructor Create(rgb: IRGB8bit); property RGB8Intf: IRGB8bit read FRGB8bit implements IRGB8bit; property PalRelative: Boolean read FPalRelative write FPalRelative; function Color: Integer; end; implementation constructor TRGB8ColorRefAdapter.Create(rgb: IRGB8bit); begin FRGB8bit := rgb; end; function TRGB8ColorRefAdapter.Color: Integer; begin if FPalRelative then Result := PaletteRGB(RGB8Intf.Red, RGB8Intf.Green, RGB8Intf.Blue) else Result := RGB(RGB8Intf.Red, RGB8Intf.Green, RGB8Intf.Blue); end; end.