Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
101
Добавлен:
07.11.2018
Размер:
986 Кб
Скачать
☆

Переменная Self

Внутри каждого метода неявно определяется переменная Self, ссылающаяся на объект, вызвавший этот метод. Например:

type   A=class     i: integer;     constructor Create(i: integer);     begin       Self.i:=i;     end;   end;

В момент вызова конструктора Create объект будет уже создан. Конструкция Self.i ссылается на поле i этого объекта, а не на параметр i функции Create.

Наследование

Класс может быть унаследован от другого класса. Например, при объявлении

type MyClass=class(BaseClass) ... end;

класс MyClass наследуется от класса BaseClass.

Класс-потомок называется также производным классом или подклассом, а класс-предок - базовым классом или надклассом. Потомок автоматически наследует все поля и методы своего предка. Он может также определять новые поля и методы, а также переопределять (замещать) методы предка.

Имена полей и методов, объявленные в классе, доступны до конца объявления класса, а также во всех его потомках.

Все классы неявно наследуются от класса Object. Этот класс объявлен следующим образом:

type Object=class   constructor Create;   destructor Destroy;   function TypeName: string;   function ToString: string; end;

Таким образом, любой класс может создавать свои объекты, вызывая конструктор Create без параметров, и уничтожать их, вызывая деструктор Destroy, даже если эти методы не приведены в его описании:

var m: MyClass; ... m:=MyClass.Create; ... m.Destroy;

В конце работы программы все созданные объекты должны быть разрушены. Поэтому для каждого созданного объекта рекомендуется явно вызвать деструктор. Однако, если этого не сделать, то система Pascal ABC после завершения программы автоматически вызывает деструкторы всех созданных объектов.

Метод TypeName возвращает имя класса объекта, а метод ToString - строковое представление объекта. В классе Object метод ToString также возвращает имя класса объекта, но это поведение может быть переопределено в потомках. Например:

type MyClass=class   i: integer;   constructor Create(i: integer);   begin     Self.i:=i;   end;   function ToString: string;   begin     Result:=IntToStr(i);   end; end; var a: MyClass; ... a:=MyClass.Create(3); writeln(a.TypeName); // MyClass writeln(a.ToString); // 3 

Видимость членов класса

Каждое поле, метод или свойство класса имеет атрибут, называемый видимостью. В Pascal ABC существуют три типа атрибутов видимости: public (открытый), private (закрытый) и protected (защищенный). К члену класса, имеющему атрибут public, можно обратиться из любого места программы, члены класса с атрибутом private доступны только внутри методов этого класса, члены класса с атрибутом protected доступны внутри методов этого класса и всех его подклассов. Атрибуты видимости могут находиться внутри класса, при этом все дальнейшие члены приобретают этот атрибут. Например:

type   A=class   private     x: integer;   protected     a: integer;   public     constructor Create(xx: integer);     begin       x:=xx; // верно, т.к. мы внутри метода класса, которому принадлежит закрытое поле x       a:=0; // верно     end;     procedure print;   end;   B=class(A)     procedure print;     begin       writeln(a); // верно, т.к. a - защищенное поле       writeln(x); // неверно, т.к. х - закрытое поле     end;   end; ... var a1: A; ... writeln(a1.x); // неверно, т.к. х - закрытое поле writeln(a1.a); // неверно, т.к. a - защищенное поле a1.print; // верно, т.к. print - открытый метод

По умолчанию все члены являются открытыми. В частности, метод print класса B - открытый.

Если x - закрытый или защищенный член класса, то доступ к нему с использованием явного указания объекта невозможен: запись a.x вызовет ошибку при компиляции "поле x недоступно".