Мегаобучалка Главная | О нас | Обратная связь


ДИРЕКТИВЫ protected и private



2018-07-06 341 Обсуждений (0)
ДИРЕКТИВЫ protected и private 0.00 из 5.00 0 оценок




 

Помимо объявления элементов класса (полей, методов, свойств) описание класса, как правило, содержит директивы 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 к каждому объекту списка (элементу массива), формирует строку, представляющую собой весь список.

 

 



2018-07-06 341 Обсуждений (0)
ДИРЕКТИВЫ protected и private 0.00 из 5.00 0 оценок









Обсуждение в статье: ДИРЕКТИВЫ protected и private

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (341)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)