В Камаев - Технологии программирования
- Название:Технологии программирования
- Автор:
- Жанр:
- Издательство:Издательство «Высшая школа»
- Год:2006
- Город:Москва
- ISBN:5-06-004870-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
В Камаев - Технологии программирования краткое содержание
Второе издание (1-е — 2005 г.) дополнено главами по структуре данных и основам инженерии создания программ.
Для студентов вузов, обучающихся по направлению «Информатика».
Технологии программирования - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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), достаточно написать:
AnObject.AProperty:=…;
…:= AnObject.Aproperty;
и компилятор оттранслирует эти операторы в вызовы методов.
Рассмотрим три оператора, вписанные в текст "пустой" процедуры (метод) Button1Click:
AnObject:= TAnObject.Create;
AnObject.AProperty:= 'Привет!';
Label1.Caption:= AnObject.AProperty;
Первый оператор создает экземпляр объекта. Второй оператор в недоступное по интерфейсу (protected) поле Fvalue засылает при помощи недоступной по интерфейсу (protected) процедуры AnObject.SetAProperty текст "Привет!". Третий оператор при помощи недоступной по интерфейсу (protected) процедуры АпОЬject.GetAProperty считывает данные из недоступного по интерфейсу поля Fvalue и засылает их в свойство Caption объекта надписи Label1.
Само свойство AProperty описано как общедоступное по интерфейсу (public), т. е. внешне свойство выглядит в точности, как доступ к обычному полю, но за всяким обращением к свойству могут стоять нужные программисту действия. Например, если у нас есть объект, представляющий собой квадрат на экране, и мы его свойству "цвет" присваиваем значение "белый", то произойдет немедленная перерисовка, приводящая реальный цвет на экране в соответствие значению свойства.
В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур, зависящих от вносимых изменений. Если же потребности в специальных процедурах чтения и/или записи нет, то возможно вместо имен методов применять имена полей.
Рассмотрим следующую конструкцию:
type
TPropObject = class(TObject)
FValue: TSomeType;
procedureDoSomething;
procedureCorrect(AValue: Integer);
procedureSetValue(NewValue: Integer);
procedureAValue: Integer readFvalue
writeSetValue;
end;
…
procedureTPropObject.SetValue(NewValue: Integer);
begin
if(NewValue <> FValue) andCorrect (NewValue)
then
FValue:= NewValue; {Засылка значения в поле}
DoSomething;
end;
В этом примере чтение значения свойства AValue означает просто чтение поля FValue. Зато при присвоении ему значения внутри метода SetValue вызывается сразу два метода.
Если свойство должно только читаться или только записываться, то в его описании может присутствовать только соответствующий метод:
type
TAnObject = class(TObject)
propertyAProperty: TSomeType readGetValue;
end;
Интервал:
Закладка: