Методы являются одними из наиболее примечательных атрибутов
объектно-ориентированное программирования и требуют некоторой
практики перед использованием. Вернемся сначала к исходному воп-
росу о тщетной попытке структурного программирования, связанной с
инициализацией структур данных. Рассмотрим задачу инициализации
записи со следующим определением:
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осто, не так ли?}