Описание |
Директива Protected начинает раздел объявлений определения класса. В защищенном разделе, Поля(Fields), Свойства(Properties) и Методы(Methods) объявлены как доступные для этого класса и классов происходящих от этого. Но внешне не доступных пользователям класса.
Это подобно Private директиве, которая скрывает внутреннее выполнение класса, но не скрывает такие данные и методы от подклассов.
Вообще, большинство данных и методов, внутренних для класса должны быть определены в разделе Protected. Часто это дает подклассам полезный доступ к ним. Только используйте Private, когда вы уверены, что хотите сохранить материал полностью локальным для текущего класса/модуля. Это может быть верным, когда подкласс хотел бы быть изолированным от родительских сложностей класса.
Вы, возможно, захотите сделать защищенные методы виртуальными, чтобы позволить подклассам изменять их, чтобы удовлетворить их потребности.
|
|
Похожие команды |
Function Определяет подпрограмму, которая возвращает значение
Private Начинает частный (Private) раздел данных и методов в классе
Procedure Определяет подпрограмму, которая не возвращает значение
Property Определяет управляемый доступ к полям класса
Public Начинает внешне доступный раздел класса
Published Начинается изданный, внешне доступный раздел класса
Type Определяет новую категорию переменной или процесса
| |
|
Пример кода : Подкласс, который использует защищенный метод обращения к частным данным в родительском классе |
// Полный код Модуля. // ----------------------------------------------------------- // Вы должны поместить этот код в модуль с именем Unit1 и с формой // названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;
interface
uses
Forms, Dialogs, Classes, Controls, StdCtrls, SysUtils;
type // Определение базового класса TSquare : // Он имеет частные данные, которые могут быть только установлены защищенным методом
TSquare = class private // Известный только родительскому классу
squareArea : Integer; Protected // Известный всем классам в иерархии
squareWidth, squareHeight : Integer;
procedure setArea; public // Внешне видимый пользователями класса
property width : Integer read squareWidth;
property height : Integer read squareHeight;
property area : Integer read squareArea; published // Внешне видимый: имеет также информацию во время выполнения
constructor Create(width, height : Integer);
end;
// Определение порожденного типа: // Он должен использовать защищенный родительский метод для установки // частной площади квадрата
TChangeableSquare = class(TSquare)
public
procedure ChangeSize(newWidth, newHeight : Integer);
end;
// Определение класса формы используемой этим модулем
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm} // Вложение определений формы
// Создание объекта TSquare
constructor TSquare.Create(width, height: Integer);
begin // Сохранение ширины и высоты в защищенных полях
squareWidth := width;
squareHeight := height;
// И вычисление площади квадрата
setArea;
end;
// Изменение измерений TSquare
procedure TChangeableSquare.ChangeSize(newWidth, newHeight: Integer);
begin // Перезапись первоначальных значений ширины и высоты
squareWidth := newWidth;
squareHeight := newHeight;
// И пересчёт площади квадрата
setArea;
end;
// Установка размера квадрата из его измерений
procedure TSquare.setArea;
begin // Вычисление площади квадрата и конфиденциальное сохранение
squareArea := width * height;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
mySquare : TChangeableSquare;
begin // Создание изменяемого квадрата
mySquare := TChangeableSquare.Create(30, 40);
// Какова сейчас площадь квадрата?
ShowMessage('Квадрат 30,40 площадь = '+IntToStr(mySquare.area));
// Изменение измерений квадрата
mySquare.ChangeSize(10,20);
// Какова сейчас площадь квадрата?
ShowMessage('Квадрат 10,20 площадь = '+IntToStr(mySquare.area));
end;
end.
|
Квадрат 30,40 площадь = 1200
Квадрат 10,20 площадь = 200
|
|