Шрифт:
Методы — это процедуры и функции, описанные внутри класса. Как видно, посылка сообщений в Object Pascal близка к вызову процедур языка Pascal, но имени вызываемой процедуры или процедуры-функции предшествует имя конкретного объекта, например: AMyObject.
Опишем два объекта AMyObject, BMyObject одного класса TMyObject:
При проектировании программисты считают, что каждый объект (экземпляр класса) имеет свой внутренний код методов и индивидуальную память, где размещаются свои поля.
На самом деле методы у разных объектов одного класса общие. Другими словами, они реализуются общим кодом, расположенным только в одном месте памяти. Это экономит память. В приведенном примере вызов методов:
на самом деле приведет к исполнению одного и того же кода при моделируемой для программиста видимости принадлежности своего индивидуального кода разным объектам. Это сближает методы с процедурами и процедурами-функциями языка Pascal. Напомним, что указатель — это переменная, содержащая в памяти адрес (номер ячейки) другой переменной, процедуры или объекта. В состав класса входит указатель на специальную таблицу, где содержится вся информация, нужная для вызова методов. От обычных процедур и функций методы отличаются тем, что им при вызове передается (неявно) указатель на тот объект, который их вызвал. Внутри методов он доступен под зарезервированным именем Self.
Засылка и извлечение значений в поля, согласно нерекомендуемому в Object Pascal прямому доступу, практически не отличается от использования полей записи обычного языка Pascal:
В отличие от методов поля объекта — это данные, уникальные для каждого объекта, являющегося экземпляром даже одного класса. Поля AMyObject.MyField и BMyObject.MyField. являются совершенно разными полями, поскольку они располагаются в разных объектах.
3. ОБЛАСТИ ВИДИМОСТИ
При описании нового класса важен разумный компромисс. С одной стороны, требуется скрыть методы и поля, представляющие собой внутреннее устройство класса. Маловажные детали на других уровнях будут бесполезны и только помешают целостности восприятия. Доступ к важным деталям нужно организовать через систему проверок.
В языке Object Pascal введен механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться (т. е. области видимости). Поля и методы могут относиться к четырем группам, отличающимся областями сокрытия информации:
public — общие;
private — личные;
protected— защищенные;
published — опубликованные.
Деление на составные части работает на уровне файлов модулей (Unit в смысле языка Pascal). Если вы нуждаетесь в специальной защите объекта или его части, то для этого необходимо поместить его в отдельный модуль, в котором есть собственные секции interface и implementation.
Поля, свойства и методы, находящиеся в секции public, не имеют ограничений на видимость. Они доступны из других функций и методов объектов как в данном модуле, так и во всех прочих, ссылающихся на него. Обычно методы данной секции образуют интерфейс между объектного обмена сообщениями в период выполнения программы (run-time).
Поля, свойства и методы, находящиеся в секции private, доступны только в методах класса и функциях, содержащихся в том же модуле, что и описываемый класс. Такая директива позволяет скрыть детали внутренней реализации класса от всех. Элементы из секции private можно изменять, и это не будет сказываться на программах, работающих с объектами этого класса. Единственный способ для кого-то другого — обратиться к ним — переписать заново созданный вами модуль.
Раздел protected комбинирует функциональную нагрузку разделов private и public таким образом, что если вы хотите скрыть внутренние механизмы вашего объекта от конечного пользователя, этот пользователь не сможет в run-time использовать ни одно из объявлений объекта из его protected-области. Но это не помешает разработчику новых компонент использовать эти механизмы в других наследуемых классах, т. е. protected-объявления доступны у любого из наследников вашего класса.