Листинг 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!