Если у вас нет доступа к TFirstClass и TSecondClass, но вы все еще хотите упростить свой код, вот способ:
Создание базового класса адаптера:
type
TMyAdapter = class(TObject)
public
procedure FirstMethod; virtual; abstract;
procedure SecondMethod; virtual; abstract;
end;
Затем создайте классы-потомки TFirstClassAdapter и TSecondClassAdapter и дайте им каждому частную ссылку на экземпляр TFirstClass или TSecondClass соответственно. Добавьте конструктор, который устанавливает эту ссылку. Переопределите методы классов адаптера, чтобы они вызывали адаптированные классы.
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;
То же самое для другого класса. Теперь вам нужно только решить, создадите ли вы адаптер один раз и передадите его, или создадите функцию, которую вы вызываете везде, где вам это нужно, и которая даст вам адаптер для вашего конкретного класса.
Если вы реализуете адаптер с использованием интерфейсов, вам даже не нужно будет управлять временем жизни адаптера самостоятельно.
Таким образом, вы можете получить полиморфное поведение, которое Ульрих дал в своем ответе , но без необходимости менять TFirstClass и TSecondClass.