Материал: Мансуров. Основы программирования в среде Lazarus. 2010

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 5 Основы объектно-ориентированного программирования

____________________________________________________________________

function TStudent.Status: string; begin

Result:= ' - студент'; end;

function TStudent.GetData: string; begin

Result:= inherited GetData + ', группа ' + group; end;

type

TProfessor = class(THuman) private

kafedra: string; public

function GetData: string; function Status: string; override;

end;

function TProfessor.Status: string; begin

Result:= ' - преподаватель'; end;

function TProfessor.GetData: string; begin

Result:= inherited GetData + ', кафедра ' + kafedra; end;

451

5.5. Полиморфизм

____________________________________________________________________

var

Student: TStudent; Professor: TProfessor; fname: string;

begin

Student:= TStudent.Create; fname:= Student.GetData;

writeln(UTF8ToConsole('Это: ' + fname)); Professor:= TProfessor.Create; Student.name:= 'Виталий';

Student.fam:= 'Петров'; Student.group:= '"ПОВТАС-1/09"'; fname:= Student.GetData;

writeln(UTF8ToConsole('Это: ' + fname));

Professor.name:= 'Иван';

Professor.fam:= 'Иванов';

Professor.kafedra:= '"Программирование"';

fname:= Professor.GetData;

writeln(UTF8ToConsole('Это: ' + fname)); writeln(UTF8ToConsole('Нажмите любую клавишу'));

readkey;

Student.Free;

Professor.Free;

end.

При выполнении оператора

Student:= TStudent.Create;

сработает конструктор, определенный нами в классе THuman, поскольку он пе-

452

Глава 5 Основы объектно-ориентированного программирования

____________________________________________________________________

рекрывает стандартный конструктор. В результате поля Fname и Ffam будут инициализированы значениями 'Андрей' и 'Аршавин'. После выполнения

операторов

fname:= Student.GetData;

writeln(UTF8ToConsole('Это: ' + fname));

на экран будет выведено

"Это: Андрей Аршавин – студент, группа".

Обратите внимание, название группы выведено не будет. Для инициализа-

ции значения поля group необходимо написать конструктор в классе

TStudent, например таким образом:

constructor TStudent.Create;

begin

group:= '"Арсенал"';

end;

Теперь при выполнении оператора

Student:= TStudent.Create;

будет вызван конструктор, определенный в классе TStudent и на экран будет выведено:

"Это: – студент, группа "Арсенал"".

Мы видим, что имя и фамилия отсутствуют. Это опять происходит из-за того,

что конструктор Create дочернего класса TStudent перекрывает конструк-

453

5.5. Полиморфизм

____________________________________________________________________

тор родительского класса THuman. Чтобы вызвать конструктор родительского класса, необходимо использовать ключевое слово inherited. Таким образом,

реализацию конструктора класса TStudent необходимо записать в виде:

constructor TStudent.Create;

begin

inherited Create;

group:= '"Арсенал"';

end;

Теперь на экран будет выведена строка так, как мы хотели: "Это: Андрей Аршавин – студент, группа "Арсенал"".

Вполне возможно использовать конструкторы с параметрами. Вот как, на-

пример, может выглядеть конструктор с параметрами класса THuman:

public

constructor Create(n, f: string);

………………………………………………………………………………………………………

end; implementation { THuman }

constructor THuman.Create(n, f: string); begin

Fname:= n;

Ffam:= f;

end;

Конструктор класса TStudent:

454

Глава 5 Основы объектно-ориентированного программирования

____________________________________________________________________

public

constructor Create(gr: string);

…………………………………………………………………………………………………

end;

constructor TStudent.Create(gr: string);

begin

inherited Create('Андрей', 'Аршавин');

group:= gr;

end;

Если вы теперь вызовете конструктор в виде

Student:= TStudent.Create;

то компилятор будет "сильно ругаться"! Необходимо вызывать конструк-

тор таким образом:

Student:= TStudent.Create('"Арсенал"');

Обратите внимание и на вызов конструктора родительского класса

inherited Create('Андрей', 'Аршавин');

Поскольку, мы с вами отлично знаем, что Андрей Аршавин не студент, видоиз-

мените описания классов, чтобы на экран выводилось, ну что-то типа: "Андрей Аршавин – футболист команды Арсенал".

В заключение отметим, что конструктор создаѐт новый объект только в том случае, если перед его именем указано имя класса. Если указать имя уже существующего объекта, он поведѐт себя по-другому: не создаст новый объект,

а только выполнит код, содержащийся в теле конструктора.

Деструктор имеет стандартное имя Destroy и предназначен для уничто-

455

Смотрите также:

1 — пак
11 Горм +
113
14
1433
1511
1632
199
204
2714