Рис. 1. Экранная форма примера
Кликнем кнопку Button1 и отредактируем исходный текст модуля до следующего текста:
unittestir;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedureButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TSomeType = String;
type
TAnObject = class(TObject)
private
FValue: TSomeType;
function GetAProperty: TSomeType;
procedureSetAProperty (ANewValue: TSomeType);
public
propertyAProperty: TSomeType
readGetAProperty
writeSetAProperty;
end;
var
Form1: TForm1;
AnObject: TAnObject;
implementation
{$R *.DFM}
procedureTForm1.ButtonlClick(Sender: TObject);
begin
AnObject:= TAnObject.Create;
AnObject.AProperty:= 'Привет!';
Label1.Caption:= AnObject.AProperty;
end;
procedureTAnObject.SetAProperty(
ANewValue: TSomeType);
begin
FValue:= ANewValue; {Засылка значения в поле}
end;
functionTAnObject.GetAProperty: TSomeType;
begin
GetAProperty:= FValue; {Чтение значения из поля}
end;
end.
Сохраним проект (Save Project As). При сохранении проекта укажем новое имя модуля — testir и новое имя проекта — PrTestir. Рассмотрим текст получившегося файла проекта (пункты меню View и далее Project Source):
programPrTestir;
uses
Forms,
testir in 'testir.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Данный файл содержит текст основной программы PrTestir. К основной программе подключаются модуль Forms (для работы с формой) и исходный код модуля testir. Три исполняемых оператора основной программы последовательно организуют новый вычислительный процесс выполнения написанной программы PrTestir, создадут объект формы Form1, осуществят запуск программы на выполнение (Run).
В набранном примере текст модуля содержит сгенерированный текст объявления объектного типа Tform1. В типе содержатся указания на агрегацию в данном классе объекта кнопки Button1: Tbutton и объекта Label1: Tlabel. Благодаря агрегации экземпляры объектов кнопки и надписи будут создаваться одновременно с созданием экземпляра объекта формы, в результате чего как бы получится совместно работающий с кнопкой и надписью объект формы. В типе Tform1 Delphi по двойному щелчку мыши по кнопке сгенерировала прототип вызова метода:
procedureButton1Click(Sender: TObject).
Также Delphi автоматически сгенерировала переменную объектного типа
var
Form1: TForm1;
и в секции реализации вставила текст "пустой" процедуры Button1Click отработки действий по нажатию кнопки Button1.
Рассмотрим элементы, добавленные нами в текст модуля по реализации инкапсуляции. Итак, нами был набран текст описания класса TAnObject и переменная данного объектного типа AnObject:
type
TAnObject = class(TObject) private
FValue: TSomeType;
functionGetAProperty: TSomeType;
procedureSetAProperty (ANewValue: TSomeType);
public
propertyAProperty: TSomeType
readGetAProperty
writeSetAProperty;
end;
var
AnObject: TanObject.
Обычно свойство (property)определяется тремя своими элементами: полем и двумя методами, которые осуществляют его запись/чтение:
private
FValue: TSomeType;
functionGetAProperty: TSomeType;
procedureSetAProperty (ANewValue: TSomeType);
public
property AProperty: TSomeType
readGetAProperty
writeSetAProperty;
…
procedureTAnObject.SetAProperty(ANewValue: TSomeType);
begin
FValue:= ANewValue; {Засылка значения в поле}
end;
functionTAnObject.GetAProperty: TSomeType;
begin
GetAProperty:= FValue; {Чтение значения из поля}
end;
В данном примере свойство Aproperty выполняет такую же функцию, какую в предшествующем примере выполняло поле MyField. Доступ к значению свойства Aproperty осуществляется через вызовы методов GetAProperty и SetAProperty. Однако в обращении к этим методам в явном виде нет необходимости (в рассматриваемом примере они даже защищены — protected), достаточно написать:
Читать дальше