Методы
Методы являются одними из наиболее примечательных атрибутов объектно-ориентированное программирования и требуют некоторой практики перед использованием. Вернемся сначала к исходному воп- росу о тщетной попытке структурного программирования, связанной с инициализацией структур данных. Рассмотрим задачу инициализации записи со следующим определением:
TEmployee = object Name: string[25]; Title: string[25]; Rate: Real; end;
Большинство программистов использовали бы оператор with для присвоения полям Name, Title и Rate начальных значений:
var MyEmployee: Employee; with MyEmployee do begin Name := 'Sanderson, Arthur'; Title := 'Word processor'; Rate := 9.45; end;
Это тоже неплохо, но здесь мы жестко ограничены одной специ- фическим экземпляром записи - MyEmployee. Если потребуется иници- ализировать более одной записи типа Employee, то вам придется ис- пользовать большее число операторов with, которые выполняют в точности те же действия. Следующим естественным шагом является создание инициализирующей процедуры, которая обобщает оператор with применительно к любому экземпляру типа TEmployee, пересылае- мой в качестве параметра:
procedure InitTEmployee(var Worker: TEmployee; AName, ATitle: String; ARate: Real); begin with Worker do begin Name := NewName ; Title := NewTitle; Rate := NewRate; end; end;
Это будет работать, все в порядке, однако если вы почувству- ете, что при этом тратите больше времени, чем необходимо, то вы почувствуете то же самое, что чувствовал ранний сторонник объект- но-ориентированного программирования.
Это чувство значит, что, ну, скажем, вы разрабатываете про- цедуру InitTEmployee специально для обслуживания типа TEmployee. Тогда почему вы должны помнить, какой тип записи и какой его эк- земпляр обрабатывает InitTEmployee? Должен существовать некоторый путь объединения типа записи и обслуживающего кода в одно единое целое.
Такой путь имеется и называется методом. Метод - это проце- дура или функция, объединенная с данным типом столь тесно, что метод является как бы окруженным невидимым оператором with, что делает экземпляр данного типа доступными изнутри для метода. Оп- ределение типа включает заголовок метода. Полное определение ме- тода квалифицируется в имени типа. Тип объекта и метод объекта являются двумя лицами этой новой разновидности структуры, именуе- мой методом.
type TEmployee = object Name, Title: string[25]; Rate: Real; procedure Init (NewName, NewTitle: string[25]; NewRate: Real); end;
procedure TEmployee.Init (NewName, NewTitle: string[25]; NewRate: Real); begin Name := NewName ; { Поле Name объекта TEmployee } Title := NewTitle; { Поле Tutle объекта TEmployee } Rate := NewRate; { Поле Rate объекта TEmployee } end;
Теперь для инициализации экземпляра типа TEmployee вы просто вызываете его метод, словно метод является полем записи, что име- ет вполне реальный смысл:
var AnEmployee: TEmployee; AnEmployee.Init('Sara Adams, Account manager, 15000'); {пpосто, не так ли?}