Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_OOP док.doc
Скачиваний:
13
Добавлен:
28.03.2015
Размер:
313.34 Кб
Скачать

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

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

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; // теперь можем исп.защищенные данные!!! Этой технологии взлома все таки следует избегать.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]