На перегрузку методов накладывается ограничение - нельзя перегружать методы, находящиеся в области видимости published, m. е. me, которые будут использоваться в Инспекторе объектов.
Области видимости
При описании нового класса важен разумный компромисс. С одной стороны, требуется скрыть от других методы и поля, представляющие собой внутреннее устройство класса (для этого и придуманы свойства). Маловажные детали на уровне пользователя объекта будут бесполезны и только помешают целостности восприятия.
С другой стороны, если слишком ограничить того, кто будет порождать классы-потомки, и не обеспечить ему достаточный набор инструментальных средств и свободу маневра, то он и не станет использовать ваш класс.
В модели объектов языка Object Pascal существует механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (области видимости). Поля и методы могут относиться к четырем группам (секциям), отличающимся областями видимости. Методы и свойства могут быть общими (секция public), личными (секция private), защищенными (секция protected) и опубликованными (секция published). Есть еще и пятая группа, automated, она ранее использовалась для создания объектов СОМ; теперь она присутствует в языке только для обратной совместимости с программами на Delphi версий 3-5.
Области видимости, определяемые первыми тремя директивами, таковы.
□ Поля, свойства и методы секции public не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него.
О Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и в функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет полностью скрыть детали внутренней реализации класса. Свойства и методы из секции private можно изменять, и это не будет сказываться на программах, работающих с объектами этого класса. Единственный способ для кого-то другого обратиться к ним - переписать заново созданный вами модуль (если, конечно, доступны исходные тексты).
□ Поля, свойства и методы секции protected также доступны только внутри модуля с описываемым классом. Но - и это главное - они доступны в классах, являющихся потомками данного класса, в том числе и в других модулях. Такие элементы особенно необходимы для разработчиков новых компонентов - потомков уже существующих. Оставляя свободу модернизации класса, они все же скрывают детали реализации от того, кто только пользуется объектами этого класса.
Рассмотрим пример, иллюстрирующий три варианта областей видимости.
unit First; interface
type
TFirstObj = class private
procedure Methodl; protected
procedure Method2; public
procedure Method3;
end;
procedure TestProcl;
unit Second;
interface uses First;
type
TSecondObj = class(TFirstObj)
procedure Method4;
end;
procedure TestProc2;
implementation
uses dialogs;
var AFirstObj: TFirstObj;
procedure TestProcl;
begin
AFirstObj := TFirstObj.Create;
AFirstObj.Methodl;
{допустимо} AFirstObj.Method2;
{допустимо} AFirstObj.Method3;
{допустимо} AFirstObj.Free;
end;