Utilisation des interfaces au travers de la hiérarchie

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des interfaces


L'utilisation d'interfaces vous permet de séparer la manière d'utiliser une classe de la manière dont elle est implémentée. Deux classes peuvent implémenter la même interface sans descendre de la même classe de base. En obtenant une interface à partir d'une classe, vous pouvez appeler les mêmes méthodes sans avoir à connaître le type de la classe. Cette utilisation polymorphe de la même méthode pour des objets sans rapport entre eux est possible car les objets implémentent la même interface. Par exemple, soit l'interface :

IPaint = interface
  procedure Paint;
end;

et les deux classes,

TSquare = class(TPolygonObject, IPaint)
  procedure Paint;
end;
TCircle = class(TCustomShape, IPaint)
  procedure Paint;
end;

Que ces deux classes aient ou non un ancêtre commun, elles sont toujours compatibles pour l'affectation avec une variable de type IPaint :

var
  Painter: IPaint;
begin
  Painter := TSquare.Create;
  Painter.Paint;
  Painter := TCircle.Create;
  Painter.Paint;
end;

Il est possible d'obtenir le même résultat en faisant dériver TCircle et TSquare d'un ancêtre commun (TFigure), qui déclare une méthode virtuelle Paint. Dans ce cas TCircle et TSquare doivent redéfinir la méthode Paint. Dans l'exemple précédent, IPaint peut être remplacé par TFigure. Cependant, considérez l'interface suivante :

IRotate = interface
  procedure Rotate(Degrees: Integer);
end;

IRotate a un sens pour le rectangle, mais pas pour le cercle. Les classes seraient alors définies de la manière suivante :

TSquare = class(TRectangularObject, IPaint, IRotate)
  procedure Paint;
  procedure Rotate(Degrees: Integer);
end;
TCircle = class(TCustomShape, IPaint)
  procedure Paint;
end;

Vous pouvez ensuite créer une classe TFilledCircle qui implémente l'interface IRotate afin de permettre la rotation d'un motif pour remplir le cercle sans avoir à ajouter la rotation au cercle simple.

Remarque : Dans ces exemples, on suppose que la classe de base immédiate ou une classe ancêtre a implémenté les méthodes de IInterface, l'interface de base dont dérivent toutes les interfaces. Pour plus d'informations sur IInterface, voir Implémentation IInterface et Gestion mémoire des objets interface.

Voir aussi