Я хотел бы получить несколько предложений по следующей проблеме: Допустим, вы хотите написать адаптеры для элементов управления 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;
Какое решение вы бы предпочли? Или есть третье решение, которое еще лучше?
С уважением,
Кристиан