Я хотел бы получить некоторые предложения по следующей проблеме: Допустим, вы хотите написать адаптеры для элементов управления VCL.Все адаптеры должны иметь одинаковый базовый класс, но отличаться друг от друга специальными элементами управления (например, получение значения из TEdit отличается от получения значения из TSpinEdit).Итак, первая идея - создать иерархию классов, такую как
TAdapter = class
end;
TEditAdapter = class (TAdapter)
end;
TSpinEditAdapter = class (TAdapter)
end;
Теперь я хочу ввести поле для хранения ссылки на элемент управления vcl.В моих специальных адаптерах я хочу - конечно - работать с конкретным подклассом.Но базовый класс также должен содержать ссылку (например, если я хочу использовать адаптер, чтобы сделать элемент управления видимым).
Возможность 1 (Downcast в Property 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, если я что-то делаю в своем базовом классе, я использую защищенныйfield.
Возможность 2 (Используйте базовый базовый класс):
TAdapter = class
end;
TAdapter <T : TControl> = class (TAdapter)
protected
FCtrl : T;
end;
TEditAdapter = class (TAdapter <TEdit>)
end;
Какое решение вы бы предпочли?Или есть третье решение, которое даже лучше?
С уважением,
Кристиан