SW-Design:Адаптеры для иерархии классов в Delphi (Generics vs. Downcast)

Я хотел бы получить несколько предложений по следующей проблеме: Допустим, вы хотите написать адаптеры для элементов управления VCL. Все адаптеры должны иметь один и тот же базовый класс, но отличаться оберткой специальных элементов управления (например, получение значения из TEdit отличается от получения значения из TSpinEdit). Итак, первая идея - создать иерархию классов наподобие

TAdapter = class
end;

TEditAdapter = class (TAdapter)
end;

TSpinEditAdapter = class (TAdapter)
end;

. Теперь я хочу ввести поле для хранения ссылки на элемент управления vcl. В моих специальных адаптерах я хочу - конечно же - работать с конкретным подклассом. Но базовый класс также должен содержать ссылку (например, если я хочу использовать адаптер, чтобы сделать элемент управления видимым).

Возможность 1 (понижение в Accessor свойства):

TAdapter = class
protected
  FCtrl : TControl;
end;

TEditAdapter = class (TAdapter)
  public
    property Control : TEdit read GetControl write Setcontrol;
end;
{...}
function TEditAdapter.GetControl : TEdit;
begin
  Result := FCtrl as TEdit;
end;

Итак, если я реализую определенный метод, я работаю со свойством Control, если я что-то делаю в своем базовом классе, я использую защищенное поле.

Возможность 2 (Использовать общий базовый класс):

TAdapter = class
end;

TAdapter <T : TControl> = class (TAdapter)
protected
  FCtrl : T;
end;

TEditAdapter = class (TAdapter <TEdit>)
end;

Какое решение вы бы предпочли? Или есть третье решение, которое еще лучше?

С уважением,

Кристиан

6
задан Andriy M 17 June 2011 в 12:07
поделиться