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

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

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

____________________________________________________________________

Здесь мы описали родительский класс в отдельном модуле Unit1. Обра-

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

следнику, мы в классе THuman объявили поля со спецификатором protected.

Если поля родительского класса защитить спецификатором private, то дочерний класс может получить доступ к его полям с помощью его свойств (ра-

зумеется, в родительском классе должны быть описаны соответствующие свой-

ства).

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils; type

{ THuman } THuman = class

private

Fname: string;

Ffam: string;

procedure Setname(const AValue: string); procedure Setfam(const AValue: string);

public

property name: string read Fname write Setname; property fam: string read Ffam write Setfam;

431

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

____________________________________________________________________

function GetData: string; end;

implementation

{ THuman }

procedure THuman.Setname(const AValue: string); begin

if Fname=AValue then exit; Fname:=AValue;

end;

procedure THuman.Setfam(const AValue: string); begin

if Ffam=AValue then exit; Ffam:=AValue;

end;

function THuman.GetData: string; begin

Result:= name + ' ' + fam; end;

end.

program project1; {$mode objfpc}{$H+}

uses

CRT, FileUtil, Unit1;

432

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

____________________________________________________________________

type

TStudent = class(THuman) // объявление класса - наследника private

group: string; end;

var

Student: TStudent; fname: string;

begin

Student:= TStudent.Create;

Student.name:= 'Виталий';

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

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

Student.Free;

end.

Напишем класс TProfessor (преподаватель). Преподаватель тоже явля-

ется человеком (или у вас есть сомнения на этот счет?!), поэтому совершенно естественно, что этот класс будет также наследоваться от класса THuman. Так же как студенты "кучкуются" в группы, так и преподаватели объединяются в кафедры. Поэтому для класса введем поле kafedra. В следующем примере создаются сразу два класса наследника. Приведу только код основной про-

граммы. Класс THuman (модуль Unit1, см. предыдущий пример) не претерпит

433

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

____________________________________________________________________

никаких изменений.

program project1; {$mode objfpc}{$H+} uses

CRT, FileUtil, Unit1; type

TStudent = class(THuman) // объявление класса - наследника private

group: string; end;

type

TProfessor = class(THuman) // объявление класса - наследника private

kafedra: string; end;

var

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

begin

Student:= TStudent.Create; Professor:= TProfessor.Create; Student.name:= 'Виталий'; Student.fam:= 'Петров'; Student.group:= 'ПОВТАС-1/09'; fname:= Student.GetData;

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

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

434

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

____________________________________________________________________

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

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

fname:= Professor.GetData;

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

readkey;

Student.Free;

end.

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

Во всех примерах раздела 5.4. мы использовали метод GetData родитель-

ского класса. Но он возвращает только значения полей name и fam. Поэтому,

несмотря на то, что мы в программе указывали значения полей group и kafedra, они на экран не выводились. Как же вывести значения этих полей?

Решение заключается в написании соответствующего метода в дочернем классе. Причем мы вольны присваивать этому методу любое имя. Например,

мы можем написать методы:

function TStudent.A: string; begin

Result:= name + ' ' + fam + ', группа ' + group; end;

function TProfessor.B: string; begin

Result:= name + ' ' + fam + ', кафедра ' + kafedra; end;

435

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

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