Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
10 Директивы видимости
Для поддержки инкапсуляции, основанной на классах, в состав OP имеются 3 спецификатора доступа: private, protected, public. Ключевое слово private помечает поля и методы, которые не доступны вне модуля, в котором определен класс. Ключевое слово protected определяет частично доступные поля и методы. Доступ к ним имеют только методы данного класса или его потомков. Ключевое слово public определяет поля и методы, к которым может обращаться любая часть программы. Как правило, все поля класса относятся к категории private, а методы определяются с использованием public. Это хороший стиль программирования. Однако эти правила не являются жесткими. Методы тоже могут объявляться в прайвите, если будут использоваться для внутренних целей. Спецификаторы доступа служат только для одной задачи: с их помощью можно ограничить доступ к определенным членам класса, объявленным в интерфейсной части модуля, со стороны кода, не являющегося частью этого модуля.
11 Инкапсуляция при помощи свойств
Свойство – это имя, скрывающее реализацию доступа к информации объекта. Свойство позволяет существенно модифицировать внутреннее строение класса, не внося никаких изменений в код, использующий класс. Синонимом понятию свойства является термин «виртуальное поле». С точки зрения пользователя, свойство выглядит как поле и его значение можно читать и записывать. На самом деле, реализация свойства может быть различной. Во-первых, можно напрямую отобразить свойство на поле. (Упрощённая инкапсуляция). Во-вторых, можно назначить методы, которые будут использоваться для осуществления чтения и записи. Во втором случае в рамках этих методов может выполняться целый комплекс действий, связанных с доступом к значению свойств. (Расширенная инкапсуляция). Технически свойство – это идентификатор, который отображается на данные или методы при помощи специальных ключевых слов read и write. Например: property Month: integer read FMonth write SetMonth Часто связанные со свойством данные и методы являются частными (private) или защищенными (protected). Свойство является общедоступным (public), т. е. любой доступ к этим данным и методам может осуществляться только при помощи свойства. Благодаря этому инкапсуляция с помощью свойств является как расширенной, так и упрощенной. Инкапсуляцию называют расширенной, потому что можно не только менять внутреннее представление данных и функции доступа, но и добавлять новые функции доступа, совершенно не меняя кода, который обращается к классу. Инкапсуляцию называют упрощённой, потому что в случае, когда не требуется никакого дополнительного кода, можно просто отобразить свойства на поля и не загромождать внутреннее строение класса примитивными методами доступа к внутренним полям. Однако, если такие методы необходимы, то необходимы, можно использовать механизм завершения класса (Ctrl+Shift+C).
12 Свойства-массивы
Свойства-массивы (или свойства, «основанные на массивах»), предоставляют возможность ссылаться на множество значений свойства, используя одно и то же имя свойства. Каждое указываемое значение определяется в массиве отдельным индексом (т. е. одно имя). Массив свойств объявляется так же как обычное свойство, но есть отличия. 1) После имени свойства-массива необходимо определить список индексированных параметров, при этом список заключается в [ ], но форматируется как список параметров процедуры или функции, т. е. указывается тип индексов. 2) Спецификаторы методов чтения и записи (если определены) должны ссылаться только на метод доступа. 3)В качестве типа индекса можно использовать не обязательно скалярный тип, можно, например, и строковый. 4)На массив свойство нельзя ссылаться как на единое целое, что возможно в случае обычных массивов. Пример. Unit interface TVectorClass = class private FVector: array [1..10] of word; protected function GetVector (index: integer): word; procedure SetVector (index: string; value: word); procedure AddToVector (index: string; value: word); public property Elements [index: integer]: word read GetVector write SetVector; default; property AddToElement [index: integer]: word write AddVectorElement;
13 Индексированные свойства
Индексированные свойства – это свойства, имеющие спецификатор index. В этом случае несколько различных свойств, имеющих уникальные имена, используют одни и те же методы доступа, к разным элементам одного и того же поля-массива. Т. е. происходит автонастройка методов доступа, в зависимости от того, какое свойство они обслуживают в данный момент. Пример. Type TMyPanel = class MyProps: array [1..3] of integer; private procedure SetProperty(index: integer; const Value: integer); function GetProperty(index: integer): integer; public property MyHeight:integer index 1 read GetProperty write SetProperty; property MyWidth:integer index 2 read GetProperty write SetProperty; property MyColor:integer index 3 read GetProperty write SetProperty; end; … … procedure TMyObject. SetProperty(index: integer;const value: integer); begin MyProps[index]:= Value end; function TMyObject. GetProperty(index: integer): integer; begin Result:= MyProps[index] end; … … MyPanel. Width:= widthbar. position; MyPanel. Height:= heightbar. position; MyPanel. Color:= ColorBox1.colors[MyColor];
14 Свойства и иерархия классов
Объявление свойств в разделе public – требование не обязательное. Часто их бывает полезно объявить в разделе protected. Иногда для получения преимуществ от определенных побочных эффектов, закодированных в методах доступа, класс может скрывать свойство, которое объявляется в разделе private или protected так, чтобы классы-потомки могли решать, показывать свойство пользователю или нет. Класс-потомок наследует свойство и имеет возможность переопределить видимость. При повторном определении свойства не обязательно задавать тип или методы доступа. Ограничение: нельзя задавать свойства менее видимыми в классе-потомке. В этом случае программа будет компилироваться, но свойство всё равно будет видно.
15 Конструкторы, перегрузка конструкторов
Метод create – это конструктор – специальный метод, который можно применить к классу для выделения памяти под экземпляр данного класса. Экземпляр возвращается конструктором, и его можно присвоить переменной для хранения и дальнейшего использования объекта.
По умолчанию TObject. Create устанавливает все данные созданного экземпляра равными нулю. Если необходимо, чтобы экземпляр создавался с другими начальными данными, то нужно написать свой конструктор. Можно либо переопределить конструктор create, либо создать новый конструктор с любым именем, используя слово constructor. Рекомендуется использовать стандартное имя create. При создании нового конструктора не нужно обращаться к TObject. Create, так как память выделяется Delphi.
Конструктор Create обращается к методу класса InstanceSize для определения размера необходимой для размещения объекта памяти. Затем он запрашивает область памяти необходимого размера, используя процедуру NewInstance и инициализирует нулевыми значениями, используя процедуру InitInstance, а в качестве результата возвращает адрес области памяти Пример. TDate = class public constructor Create (y, m,d:integer); … constructor TDate. Create (y, m,d:integer); begin FDate:=Date(y, m,d) end;
В Delphi также возможно переопределение конструктора. Т. е. можно создать несколько конструкторов, назвав их всех именем create.
16 Деструкторы
Аналогично конструкторам, можно определить собственный деструктор класса – метод, объявляемый при помощи ключевого слова destructor и имеющий имя destroy. Деструктор обычно производит освобождение ресурсов перед уничтожением объекта. При разрушении собственного деструктора в класс добавляется код, который будет выполнен перед уничтожением объекта. В собственный деструктор не следует добавлять операции, связанные с освобождением памяти – все связанные с этим процедуры выполняются автоматически. Destroy – это виртуальный деструктор Класса TObject .
Большая часть классов переопределяет этот метод. Не рекомендуется определять другой деструктор класса. Дело в том, что объекты обычно уничтожаются при помощи метода Free, который в свою очередь обращается к виртуальному деструктору Destoy конкретного класса. Free – это метод класса TObject, наследуемый всеми остальными классами. Прежде чем обратиться к destroy, метод free проверяет, не равен ли текущий объект nil. Псевдокод:
procedure TObject. Free; begin if self <> nil then Destroy end;
Как видно из кода, обращение к методу Free не устанавливает ссылку на объект в nil. Поэтому это необходимо делать самостоятельно. Причина: объект не знает, какие именно переменные на него ссылаются. В версиях Delphi, начиная с пятой появилась процедура freeandnil.
procedure FreeAndNil (var Obj1); var P: TObject; begin P:= TObject (Obj1); P. Free; end;
17 Ссылочная модель объектов Delphi
Использование памяти в Delphi осуществляется в соответствии со следующими правилами. 1) Прежде чем использовать объект, его нужно создать. 2) После использования ненужный объект нужно уничтожить. 3)Уничтожать объект допускается только один раз. Необходимо ли писать это вручную? Delphi предлагает 3 разновидности управления памятью для динамических переменных, т. е. тех, которые располагаются в куче. 1) Если объект создаётся явно в коде приложения, значит уничтожать его необходимо самостоятельно, иначе занимаемая им память будет недоступна другим объектам. 2)Если мы создаём компонент, то можно указать другой компонент, который будет являться его владельцем. При этом владелец компонента передается конструктору компонента в качестве аргумента. Владелец становится ответственным за все уничтожение объектов, которыми он владеет, т. е. при уничтожении форма уничтожает все компоненты, которыми она владеет. 3) Когда выделяется память для строк динамических массивов и объектов, представленных переменными интерфейсов, Delphi автоматически освобождает память в момент выхода из области видимости ссылки. Однократное освобождение объектов. Если обратиться к деструктору Destroy дважды, произойдёт ошибка. Если не забыть установить ссылку на объект в nil, то к методу Free можно обращаться несколько раз без каких-либо проблем. Free – это статический метод, и его адрес известен во время компиляции, а Destroy – виртуальный метод, адрес которого определяется в процессе выполнения программы. При этом осуществляется анализ типа объекта – опасная операция в случае не существования объекта. if assigned(anObj) then … if anObj <> nil then…
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


