ДИРЕКТИВЫ 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; Примечание Иногда нужно полностью скрыть элементы класса. В этом случае определение класса следует поместить в отдельный модуль, а в программу, которая использует объекты этого класса, поместить ссылку на модуль.
БОЛЬШОЙ ПРИМЕР, ДЕМОНСТРИРУЮЩИЙ ПРИНЦИП ПОЛИМОРФИЗМА
Пусть определены три класса, один из которых является базовым для двух других: Tуре // базовый класс TPerson = class fname: string;// имя constructorCreate(name:string); function info: string; virtual; end; // производный от TPerson TStud = class(TPerson) fgr:integer; // номер учебной труппы constructorCreate(name:string;gr:integer); functioninfo: string; override;перекрыть end; // производный от TPerson TProf = class(TPerson) fdep:string;// название кафедры constructorCreate(name:string;dep:string); function info: string; override; end; В каждом из этих классов определен метод info. В базовом классе при помощи директивы virtualметод info объявлен виртуальным. Объявление метода виртуальным дает возможность дочернему классу произвести замену виртуального метода своим собственным. В каждом дочернем классе определен свой метод info, который замещает соответствующий метод родительского класса (метод порожденного класса, замещающий виртуальный метод родительского класса, помечается директивой override). Ниже приведено определение метода info для каждого класса. functionTPerson.info:string; Begin result := ''; end; functionTStud.info:string; Begin result := fname + ' гp.' + IntTostr(fgr); end; functionTProf.info:string; Begin result := fname + ' каф.' + fdep; end; Так как оба класса порождены от одного и того же базового, объявить список студентов и преподавателей можно так (здесь следует вспомнить, что объект — это указатель): list: array[l..SZL] of TPerson; Объявить подобным образом список можно потому, что язык Delphi позволяет указателю на родительский класс присвоить значение указателя на дочерний класс. Поэтому элементами массива list могут быть как объекты класса TStud, так и объекты класса TProf. Вывести список студентов и преподавателей можно применением метода info к элементам массива. Например, так: st := ''; for i:=l to SZL do // SZL - размер массива-списка iflist[i] о NIL thenst := st + list[i].Info+ #13; ShowMessage (st); Во время работы программы каждый элемент массива может содержать как объект типа Tstud, так и объект типа TProf. Концепция полиморфизма обеспечивает применение к объекту именно того метода, который соответствует типу объекта. Следующая программа, используя рассмотренные выше объявления классов TPerson, TStud и TProf, формирует и выводит список студентов и преподавателей. Текст программы приведен в листинге 9.1, а диалоговое окно — на рис. 9.1. Рис. 9.1.Диалоговое окно программы Полиморфизм Листинг 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; procedureButtonlClick(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[l..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; // щелчок на кнопке Добавить procedureTForml.ButtonlClick(Sender: TObject); Begin if n < SZL then begin // добавить объект в список n:=n+l; ifRadiobuttonl.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 + #13; ShowMessage('Cпиcoк'+#13+st); end; End. Процедура TForml.Buttoniciick, которая запускается нажатием кнопки Добавить(Buttonl), создает объект iist[n] класса TStud или TProf. Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение студент(RadioButtoni) определяет класс TStud, а в положение преподаватель(RadioButton2) — класс TProf. Процедура TForm1.Button2Сlick, которая запускается нажатием кнопки Список(Button2), применяя метод info к каждому объекту списка (элементу массива), формирует строку, представляющую собой весь список.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (365)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |