Utilisation de implements pour la délégation

De RAD Studio
Aller à : navigation, rechercher

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.

Voir aussi