Указатель Self , разрешение контекста и перекрытие методов предка
Разрабатывая классы, программист может давать одинаковые имена одинаковым по существу методам или свойствам, реализация которых для разных классов несколько отличается. Эта возможность весьма важна при большом количестве классов. Без неё пришлось бы придумывать синонимы, префиксы или вводить в имена мелкие отличия, что существенно запутывает текст программы.
Каким же образом компилятор определяет который из методов должен быть вызван? При помощи выбора контекста. Как правило, в Pascal контекст определяется по типу объекта, чей метод вызывается. Если a — объект класса TLine, то a.Length означает, что нужно применить метод TLine.Length к объекту a. Если в каком–либо методе класса TLine обратиться к Length, это снова будет обращение к TLine.Length. Т.е. внутри методов класса по–умолчанию принимается контекст класса.
Но что если нам понадобилось в методе класса TLine обратиться к функции Length для определения длины строки? Как это сделать? Снова нужен оператор разрешения контекста: System.Length(s). System — контекст в котором имя Length понимается как имя функции для определения длины строки. Контекст может задаваться именем программы, модуля или класса, а так же именами объектов и записей.
Рассмотрим особый случай. Пусть в одном из методов TPoint объявлена локальная переменная с именем x. В этом методе имя x будет пониматься как имя локальной переменной, а не свойство класса TPoint. Можно ли в таком случае получить доступ к свойству или полю класса? Да! Для этого служит ключевое слово Self. Self может применяться только в методах классов и означает ссылку на объект, для которого был вызван метод. В действительности, такая ссылка является неявным параметром любого метода. Когда внутри метода класса вы обращаетесь, скажем, к полю Fx, это означает Self.Fx. Именно поэтому метод работает с полями объекта для которого был применен. Обычно, для доступа к полям или методам класса ссылку Self явно не указывают, в нашем же особом случае она пригодится, и Self.x будет означать свойство x данного объекта.
Познакомившись с неявным параметром методов класса — ссылкой Self, мы можем более точно описать метод Free:
Еще один случай разрешения контекста связан с наследованием. Если в классе –потомке объявить метод с тем же именем, что и метод класса–предка, то метод предка будет перекрыт. В предыдущей главе в классе TLine таким способом был перекрыт конструктор класса TObject — Create. Перекрывающий метод может иметь другой тип и другой список формальных параметров .
В методах по–умолчанию принимается контекст класса, но в случае необходимости можно обратиться и к перекрытому методу класса–предка. Для этого существует ключевое слово inherited, с которым мы встречались при разработке конструкторов и деструкторов. Inherited означает, что следующее имя надо понимать как метод класса–предка.
Таким образом, имена в Pascal связаны с определенным контекстом. В разных контекстах одинаковые имена имеют разный смысл. Из текущего контекста можно выбрать другой при помощи оператора контекста (точки), ключевых слов Self и inherited.
Опубликовал Kest
June 14 2011 10:50:37 ·
0 Комментариев ·
10390 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.