Si vous n'avez pas accès à TFirstClass et TSecondClass, mais souhaitez simplifier votre code, voici une façon:
Créer une classe de base de l'adaptateur:
type
TMyAdapter = class(TObject)
public
procedure FirstMethod; virtual; abstract;
procedure SecondMethod; virtual; abstract;
end;
Ensuite, créez les classes descendantes TFirstClassAdapter et TSecondClassAdapter et donnez-leur respectivement une référence privée à l'instance de TFirstClass ou de TSecondClass. Ajoutez un constructeur qui définit cette référence. Remplacer les méthodes des classes d'adaptateur, de sorte qu'ils appellent aux classes adaptées.
type
TFirstClassAdapter = class(TMyAdapter)
private
fObject: TFirstClass;
public
constructor Create(AAdaptedObject: TFirstClass);
procedure FirstMethod; override;
procedure SecondMethod; override;
end;
constructor TFirstClassAdapter.Create(AAdaptedObject: TFirstClass);
begin
inherited Create;
fObject := AAdaptedObject;
end;
procedure TFirstClassAdapter.FirstMethod;
begin
fObject.FirstMethod;
end;
procedure TFirstClassAdapter.SecondMethod;
begin
fObject.SecondMethod;
end;
Identique pour l'autre classe. Vous n'avez plus qu'à décider si vous allez créer l'adaptateur une seule fois et le transmettre, ou si vous créez une fonction que vous appelez partout où vous en avez besoin, et qui vous donnera un adaptateur pour votre classe concrète. Si vous implémentez l'adaptateur à l'aide d'interfaces, vous n'aurez même pas besoin de gérer la durée de vie de l'adaptateur vous-même.
De cette façon, vous pouvez avoir le comportement polymorphe que Ulrich a donné dans his answer, mais sans avoir besoin de changer TFirstClass et TSecondClass.
Contrôlez-vous OWNER? (Pouvez-vous changer les définitions des classes?) –
De quel type est OWNER. Comme vous êtes en train de taper vers TObject, j'assume Pointer ou Integer/Cardinal? –