Многомерные массивы свойств
Массивы свойств могут объявляться более чем с одним индексом.
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; просмотров: 1130;