Руководство по языку B.Pascal 7

Описания методов


Описание метода внутри объектного типа соответствует опере- жающему описанию (forward) этого метода. Таким образом, метод должен быть реализован где-нибудь после описания объектного типа и внутри той же самой области действия метода путем определяющего описания.

Для процедурных и функциональных методов определяющее описа- ния имеет форму обычного описания процедуры или функции, за тем исключением, что в этом случае идентификатор процедуры или функ- ции рассматривается как идентификатор метода.

Для методов конструкторов и деструкторов определяющее описа- ний принимает форму описания процедурного метода, за тем исключе- нием, что зарезервированное слово procedure заменяется на заре- зервированное слово constructor или destructor. Определяющее опи- сание метода может повторять (но не обязательно) список формаль- ных параметров заголовка метода в объектном типе. В этом случае заголовок метода должен в точности повторять заголовок в объект- ном типе в порядке, типах и именах параметров и в типе возвращае- мого функцией результата, если метод является функцией.

В определяющем описании метода всегда присутствует неявный параметр с идентификатором Self, соответствующий формальному па- раметру-переменной, обладающему объектным типом. Внутри блока ме- тода Self представляет экземпляр, компонент метода которого был указан для активизации метода. Таким образом, любые изменения значений полей Self отражаются на экземпляре.

Область действия идентификатора компонента объектного типа распространяется на блоки процедур, функций, конструкторов и деструктора, которые реализуют методы данного объектного типа. Эффект получается тот же, как если бы в начало блока метода был вставлен оператор with в следующей форме:

with Self do begin ... end;

Исходя из этих соображений, написание идентификаторов компо- нентов, формальных параметров метода, Self и любого идентификато- ра, введенного в исполняемую часть метода, должно быть уникаль- ным.

Ниже приводятся несколько примеров реализаций методов:

procedure Rect.Intersect(var R: Rect); begin if A.X < R.A.X then A.X := R.A.X; if A.X < R.A.Y then A.Y := R.A.Y;

if B.X > R.B.X then B.X := R.B.X; if B.Y < R.B.Y then B.Y := R.B.Y; if (A.X >= B.X) or (A.Y >= B.Y) then Init (0, 0, 0, 0); end;

procedure Field.Display; begin GotoXY(X, Y); Write(Name^, ' ', GetStr); end;

function NumField.PutStr(S: string): boolean; var E: integer; begin Val(S, Value, E); PutStr := (E = 0) and (Value >= Min) and (Value <= Max); end;



Содержание раздела