Многомерные массивы свойств


Массивы свойств могут объявляться более чем с одним индексом.

Property Entry[ACol,ARow:integer]:real;

Read GetEntry write SetEntry;

Здесь свойство Entry это массив с двумя индексами указываемыми на строку и столбец желаемой матрицы.

Property Pixels[x,y:integer]:Tcoord read GetPixel write SetPixel;

 

Индексированные свойства

- свойства со спецификатором Index.В этом случае несколько различных свойств, имеющих уникальные имена, используют одни и те же методы чтения и записи для доступа для доступа к разным элементам одного и того же поля – массива. Другими словами происходит автонастройка методов доступа в зависимости от того какое свойство они обслуживают в данный момент.

 

Unit UIndex;

Interface

TMasks = class

Private

FMasks: array[1..3] of word;

Function GetMask(Index:integer):word;

Procedure SetMask(Index:integer; Value:word);

Public

Property MaskForTask1:word index1 read GetMask write SetMask;

Property MaskForTask2:word index2 read GetMask write SetMask;

Property MaskForTask3:word index3 read GetMask write SetMask;

End;

 

Реализация методов Get и Set

Function TMasks.GetMask;

Begin

Result:=FMasks[index];

End;

 

procedure TMasks.SetMask;

Begin

FMasks[index]:=Value;

End;

 

………………………………….

………………………………….

Begin

myMasks:=TMasks.Create;

with myMasks do

begin

maskForTask1:=10;

maskForTask2:=5;

maskForTask3:= maskForTask1 and maskForTask2;

end;

End;

////Последний оператор SetMask(3, GetMask(1) and GetMask(2) ).

 

Ссылочная модель Дельфи. (см тетрадь)

 

Наследование

В ООП имеется возможность определить новый класс на основе существующего. Эта технология называется наследованием (созданием производного класса). Механизм наследования является одним из фундаментальных элементов ООП. Для определения подкласса необходимо указать предка в начале объявления.

 

Пример:

Дельфи каждый раз это автоматически делает при создании новой формы.

 

Tform1 = class (Tform)

…….;

Класс TForm1 наследует все поля, методы и т.п. от класса TForm. Т.е. можно применить в отношении объекта TForm1 любой публичный метод класса Tform. Класс Tform в свою очередь наследует некоторые из своих методов от другого класса и так вплоть до класса TObject, который явлеется предком любого класса в Object Pascal’e.

 

Пример:

Создадим новую версию класса TDate в котором будет изменена функция GetText;

TNewDate = class (TDate)

Public

Function GetText : string;

End;

 

Класс TNewDate порождается от класса Tdate. Говорят: Tdate явл.классом предком или родительским классом для TNewDate.

TNewDate это производный класс, класс потомок, дочерний класс для TDate.

 

Код метода GetText класса TNewDate будет откомпилирован без ошибок только в случае, если написать его в том же модуле, в котором находится класс Tdate.

Выход – protected. Но плохое тоже есть. Если много .. то пишем много protected. Иерархия большая. То исчезает инкапсуляция.

 

*мы обращаемся к приватному полю fdate класса предка. Если придется поместить класс потомок в новый модуль то надо будет объявить поле fdate как протектед или добавить в протектев метод в класс предок для чтения этого поля.

Описание большинства полей как protected делает классы более гибкими и упрощает написание подклассов. С другой стороны это разрушает идею инкапсуляции. В крупной иерархии классов изменение определения некоторых protected полей равносильно изменению общей структуры классов. Таким образом, гибкость, инкапсуляция, расширение, часто являются взаимно-противоположными целями. В случае необходимости выбора предпочтение лучше отдавать инкапсуляции. Гибкость может достигаться за счет других механизмов – позднего связывания.

 

Доступ к защищенным данным классов.

Пример:

TTest = class

Protected

ProtectedData: integer;

Public

PublicData : integer;

Function GetValue:string;

End;

Ttest.GetValue:string;

Begin

Result:=Format(‘Public: %d, Protected: %d’, [protectedData,publicData]);

End;

 

Если поместить этот класс в его собственный модуль, то будет невозможно обратиться к protected данным из других модулей.

 

Procedure Tform1.Button1Click();

Var obj:TTest;

Begin

Obj:=TTest.Create;

Obj.PublicData:=10;

Obj.ProtectedData:=20; // не компилируется, он его не видит.

ShowMessage(obj.GetValue);

Obj.Free;

End;

Выход 1 – созданим производный класс(пустой) от TTest

TNewTest=class(TTest); // потом.

Далее, используя прямое приведение типа (приведем объект obj к классу TNewTest), получим доступ к защищенным данным.

 

Procedure Tform1.Button2Click();

Var obj:TTest;

Begin

Obj:=TTest.Create;

Obj.PublicData:=10;

TNewTest(obj).ProtectedData:=20;

ShowMessage(obj.GetValue);

Obj.Free;

End; // теперь можем исп.защищенные данные!!! Этой технологии взлома все таки следует избегать.

 



Дата добавления: 2016-07-27; просмотров: 1135;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.012 сек.