Листинг 9.1. Демонстрация полиморфизма



unitpolimor;

Interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;

Type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

GroupBoxl: TGroupBox;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Button2: TButton;

procedureButton1Click(Sender: TObject);

procedureButton2Click(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

end;

Type

// базовый класс

TPerson = class

fName: string;// имя

constructorCreate(name:string);

function info:string;virtual;

end;

// класс Студент TStud = class(TPerson)

fGr:integer; // номер группы

constructorCreate(name:string;gr:integer);

function info:string;

override;

end;

// класс Преподаватель

TProf = class (TPerson)

fdep:string;// название кафедры

constructorCreate(name:string;dep:string);

functioninfo:string;

override;

end;

Const

SZL = 10; // размер списка

Var

Forml: TForm1;

List: array[1..SZL] ofTPerson; // список

n:integer =0; // кол-во людей в списке

Implementation

{$R *.DFM}

constructorTPerson.Create(name:string);

Begin

fName := name; end;

constructorTStud.Create(name:string;gr:integer);

Begin

inheritedcreate(name); // вызвать конструктор базового класса

fGr := gr; end;

constructorTProf.create(name:string; dep:string);

Begin

inheritedcreate(name); // вызвать конструктор базового класса

fDep := dep; end;

functionTPerson.Info:string;

Begin

result := fname; end;

functionTStud.Info:string;

Begin

result := fname + ' rp.' + IntToStr(fGr); end;

functionTProf.Info:string;

Begin

result := fname + ' каф.' + fDep;

end;

// щелчок на кнопке Добавить

procedureTForm1.ButtonlClick(Sender: TObject);

Begin

if n < SZL then begin

// добавить объект в список

n:=n+1;

ifRadiobutton1.Checked

then// создадим объект TStud

List[n]:=TStud.Create(Edit1.Text,StrToInt(Edit2.Text))

else// создать объект TProf

List[n]:=TProf.Create(Edit1.Text,Edit2.Text); // очистить поля ввода

Edit1.Text := '' ; Edit2.Text := '';

Edit1.SetFocus; // курсор в поле Фамилия

End

elseShowMessage('Список заполнен!');

end;

// щелчок на кнопке Список

procedureTForm1.Button2Click(Sender: TObject);

var

i:integer; // индекс

st:string;// список

Begin

fori:=1 toSZL do

if list[i] <>NIL thenst:=st + list[i].info + 113;

ShowMessage('Cпиcoк'+#13+st); end;

End.

Процедура TForml.Buttoniciick, которая запускается нажатием кнопки Добавить(Buttonl), создает объект iist[n] класса TStud или TProf. Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение студент(RadioButtoni) определяет класс TStud, а в положение преподаватель(RadioButton2) — класс TProf.

Процедура TForm1.Button2Сlick, которая запускается нажатием кнопки Список(Button2), применяя метод info к каждому объекту списка (элементу массива), формирует строку, представляющую собой весь список.

 

Директивы protected и private

Помимо объявления элементов класса (полей, методов, свойств) описание класса, как правило, содержит директивы protected (защищенный) и private (закрытый), которые устанавливают степень видимости элементов класса в программе.

Элементы класса, объявленные в секции protected, доступны только в порожденных от него классах. Область видимости элементов класса этой секции не ограничивается модулем, в котором находится описание класса. Обычно в секцию protected помещают описание методов класса.

Элементы класса, объявленные в секции private, видимы только внутри модуля. Эти элементы не доступны за пределами модуля, даже в производных классах. Обычно в секцию private помещают описание полей класса, а методы, обеспечивающие доступ к этим полям, помещают в секцию protected.

Ниже приведено описание класса TPerson, в которое включены директивы управления доступом.

TPerson = class private

FName: TName; // значение свойства Name

FAddress: TAddress; // значение свойства Address

Protected

ConstructorCreate(Name:TName);

FunctionGetName: TName;

FunctionGetAddress: TAddress;

ProcedureSetAddress(NewAddress:TAddress);

PropertyName: TName readGetName;

PropertyAddress: TAddress readGetAddress writeSetAddress;

end;

Примечание

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

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

Концепция объектно-ориентированного программирования предполагает возможность определять новые классы посредством добавления полей, свойств и методов к уже существующим классам. Такой механизм получения новых классов называется порождением. При этом новый, порожденный класс (потомок) наследует свойства и методы своего базового, родительского класса.

В объявлении класса-потомка указывается класс родителя. Например, класс TEmployee (сотрудник) может быть порожден от рассмотренного выше класса TPerson путем добавления поля FDepartment (отдел). Объявление класса TEmplioyee в этом случае может выглядеть так:

TEmployee = class(TPerson)

FDepartment: integer; // номер отдела

constructorCreate(Name:TName; Dep:integer);

end;

Заключенное в скобки имя класса TPerson показывает, что класс TEmployee является производным от класса TPerson. В свою очередь, класс TPerson является базовым для класса TEmployee.

Класс TEmpioyee должен иметь свой собственный конструктор, обеспечивающий инициализацию класса-родителя и своих полей. Вот пример реализации конструктора класса TEmployee:

constructorTEmpioyee.Create(Name:Tname;Dep:integer);

Begin

inheritedCreate(Name);

FDepartment:=Dep;

end;

В приведенном примере директивой inherited вызывается конструктор родительского класса. После этого присваивается значение полю класса-потомка.

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

engineer := TEmployee.Create('Сидоров',413);

engineer.address := 'ул.Блохина, д.8, кв.10';

Первая инструкция создает объект типа TEmployee, вторая — устанавливает значение свойства, которое относится к родительскому классу.

 


Дата добавления: 2018-08-06; просмотров: 293; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!