Область действия метода и параметр Self
Заметьте, что ни в одном из предыдущих примеров конструкция: with объект do... не встречается в явном виде. Поля данных объек- та легко доступны с помощью методов объекта. Хотя в исходном коде поля данных объекта и тела методов разделены, на самом деле они совместно используют одну и ту же область действия.
Именно поэтому один из методов TEmployee может содержать оператор GetTitle := Title без какого-либо квалификатора перед Title. И именно поэтому Title принадлежит тому объекту, который вызывает метод. Если объект вызывает метод, то выполняется неяв- ный оператор with myself do method, связывающий объект и его ме- тоды в области действия.
Неявный оператор with выполняется путем передачи невидимого параметра методу всякий раз, когда этот метод вызывается. Этот параметр называется Self и в действительности является 32-разряд- ным указателем на экземпляр объекта, осуществляющего вызов мето- да. Относящийся к TEmployee метод GetRate приблизительно эквива- лентен следующему:
function TEmployee.GetRate(var Self: TEmployee): integer; begin GetRate := Self.Rate; end;
Примечание: Синтаксически этот пример не совсем кор- ректен. Он приведен только затем, чтобы дать вам более пол- ное представление о специфической связи между объектом и его методом.
Но важно ли вам знать о существовании параметра Self? Обычно нет. Генерируемый Borland Pascal код выполняет все это автомати- чески. Однако в некоторых немногочисленных случаях вы можете за- хотеть проникнуть внутрь метода и использовать параметр Self яв- но.
Примечание: Явное использование параметра Self допуска- ется, но вы должны избегать ситуаций, в которых это требует- ся.
Параметр Self является частью физического кадра стека при всех вызовах методов. Методы, используемые как внешние на языке Ассемблера, должны учитывать Self при получении доступа к пара- метрам метода в стеке.
Примечание: Более подробно об использовании методом границ стека рассказывается в Главе 22 "Руководства по язы- ку".