Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Отличие методов от процедур и функций состоит в том, что у методов есть неявный параметр, который является ссылкой на текущий объект, т. е. является адресом экземпляра, вызвавшего этот метод. Внутри метода можно ссылаться на этот параметр при помощи ключевого слова Self. Этот дополнительный скрытый параметр необходим в тех случаях, когда создается несколько экземпляров одного объекта, и при вызове метода какого-либо объекта, этот метод должен оперировать с данными именно интересующего нас объекта. Например, такой код как pay:=d транслируется компилятором как self. pay:=d. Иногда программисты используют слово self для предотвращения конфликта имён. В модуле System есть определенный тип данных TMethod, который представляет собой запись с двумя полями: TMethod = record Code Data end; Code – адрес функции в памяти, Data – адрес экземпляра, который является значением аргумента Self. Пример использования self. Создание компонентов динамически. В этом примере необходимо явно обратиться к текущей форме в одном из её методов. При создании компонента по время выполнения программы, необходимо передать параметр Owner конструктору create компонента, а затем присвоить то же значение свойству parent. (Свойство parent элемента управления содержит информацию о том, какой другой элемент несёт ответственность за отображение этого элемента на экране) procedure TForm1.OnMouseDown (…,x, y); var btn: TButton; begin btn:=TButton. Create(Self); btn. Parent:=Self; btn. left:=x; … end;
Язык Object Pascal поддерживает перегрузку (overloading) функций и методов. Допускается существование нескольких методов с одинаковым именем при условии, что параметры у них различны. Анализируя набор параметров, компилятор определяет, какую именно версию процедуры нужно вызвать. Каждая версия метода должна сопровождаться директивой overload. Различия между версиями должно быть количественным или в типе параметров, или и в том и в другом. Есть два основных правила: каждая версия метода должна сопровождаться ключевым словом overload; разница между версиями должна быть в количестве или типе параметров или и в том, и в другом. Тип возвращаемого значения, напротив, нельзя использовать в качестве отличительного признака двух версий метода. Тип возвращаемого значение в качестве отличительного признака использовать нельзя. Перегрузку можно применять так же к глобальнымпроцессам и функциям. Пример. type TDate = class; … procedure SetValue(a, b,c:integer); overload; procedure SetValue(a, b:word); overload;
Создание и удаление объектовКонструкторы.
Метод create – это конструктор – специальный метод, который можно применить к классу для выделения памяти под экземпляр данного класса. Экземпляр возвращается конструктором, и его можно присвоить переменной для хранения и дальнейшего использования объекта. По умолчанию TObject. Create устанавливает все данные созданного экземпляра равными нулю. Если необходимо, чтобы экземпляр создавался с другими начальными данными, то нужно написать свой конструктор. Можно либо переопределить конструктор create, либо создать новый конструктор с любым именем, используя слово constructor. Рекомендуется использовать стандартное имя create. При создании нового конструктора не нужно обращаться к TObject. Create, так как память выделяется Delphi. Пример. TDate = class public constructor Create (y, m,d:integer); … constructor TDate. Create (y, m,d:integer); begin FDate:=Date(y, m,d) end; В Delphi также возможно переопределение конструктора. Деструкторы. Аналогично конструкторам, можно определить собственный деструктор класса – метод, объявляемый при помощи ключевого слова 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; *Из прошлого семестра: Создание объекта. Инициализация экземпляра объекта, имеющего виртуальные методы, должна выполняться с помощью специального метода — конструктора. Конструктор обычно присваивает полям объекта начальные значения и выполняет другие действия по инициализации объекта. В заголовке метода-конструктора слово procedure заменяется словом constructor. Удаление объекта. Действия, обратные действиям конструктора, выполняет еще один специальный метод — деструктор. Он описывается словом destructor. Конструктор выполняет действия по подготовке позднего связывания. Эти действия заключаются в создании указателя на таблицу виртуальных методов, которая в дальнейшем используется для поиска методов. Таблица содержит адреса всех виртуальных методов. При вызове виртуального метода по его имени определяется адрес, а затем по этому адресу передается управление. У каждого объектного типа имеется своя собственная таблица виртуальных методов, что и позволяет одному и тому же оператору вызывать разные процедуры. Если имеется несколько экземпляров объектов одного типа, то недостаточно вызвать конструктор для одного из них, а затем просто скопировать этот экземпляр во все остальные. Каждый объект должен иметь свой собственный конструктор который вызывается для каждого экземпляра. В противном случае возможен сбой в работе программы.
Заметим, что конструктор и деструктор могут быть и «пустыми», то есть не содержать операторов. Весь необходимый код в этом случае создается при трансляции ключевых слов constructor и destructor.
Инкапсуляция (или ограничение доступа)
Класс может иметь любое количество полей, данных и методов. ООП требует, чтобы данные были скрыты, или инкапсулированы, внутри использующего их класса. Использование метода доступа к внутренним данным объекта уменьшает вероятность появления ошибок, так как методы могут осуществлять проверку правильности изменяемых данных. Инкапсуляция так же важна, т. к. позволяет легко вносить изменения во внутреннюю структуру класса, не меняя внешнего представления объекта. В Delphi такой подход называется инкапсуляцией, основанной на классах, однако сохраняется возможность использовать инкапсуляцию, основанную на свойствах. Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса Инкапсулямция — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected. Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования. В Delphi для создания скрытых полей или методов их достаточно объявить в секции private. {TMyClass = class private FMyField: Integer; procedure SetMyField(const Value: Integer); function GetMyField: Integer; protected public property MyField: Integer read GetMyField write SetMyField; end;} Для создания интерфейса доступа к скрытым полям в Delphi введены свойства. * Из прошлого семестра: Инкапсуляция, или ограничение доступа, защита информации, является одним из основных принципов абстрактных типов данных. Абстрагирование и инкапсуляция (ограничение доступа) являются взаимодополняющими операциями: абстрагирование фокусирует внимание на внешних особенностях объекта, а инкапсуляция (защита информации) не позволяет объектам пользователя различать внутреннее устройство объекта. Ограничение доступа таким образом определяет явные барьеры между различными абстракциями. Объекты верхнего уровня абстракции не связанны прямо с подробностями их реализации на низком уровне. Считается, что для работы абстракции доступ к ее внутренней структуре должен быть ограничен. Практически это означает наличие 2-х частей в описании класса: интерфейс и реализации. Интерфейс отражает внешние проявления объекта, создавая абстракцию поведения всех объектов данного класса. Внутренняя реализация описывает механизмы достижения желаемого поведения объекта.
Инкапсуляция и модули
Внешние программы пользователя (модули) не имеют возможности доступа к локальным функциям и данным модуля. При этом, детали реализации функций и методов, объявленных в интерфейсной части, скрыты от пользователей. Поэтому разработчик методов может легко вносить изменения в реализацию методов (процедур, функций), не оказывая никакого влияния на другие части программы. В языке Object Pascal модуль (unit) — это вторичный файл исходного кода. Первичным является исходный код проекта. Каждый модуль состоит из двух основных разделов: interface (раздел интерфейса) и implementation (раздел реализации). Также в модуле могут присутствовать два дополнительных необязательных раздела: initialization (раздел инициализации) и finalization (раздел завершения). Рассмотрим назначение разделов, напрямую связанных с инкапсуляцией, то есть скрытием информации. Если говорить коротко, любой идентификатор (тип данных, подпрограмма, переменная и т. п.), объявленный в интерфейсном разделе модуля, становится видимым для другого модуля программы при условии, что имя модуля, в котором он объявлен, упоминается в выражении uses модуля, в котором он используется. Любые методы и подпрограммы, объявленные в интерфейсном разделе модуля, позже должны быть полностью реализованы в разделе реализации этого же модуля. При этом в разделе интерфейса нельзя располагать какой-либо исполняемый код. В то же время любой идентификатор, объявленный в разделе реализации модуля, является локальным по отношению к модулю и невидим для кода, не являющегося частью этого модуля. Каждый модуль может обладать своими собственными локальными данными, локальными служебными функциями и даже локальными типами данных. При этом внешние программы не обладают возможностью доступа к любым локальным для модуля идентификаторам. Благодаря этому детали реализации некоторого абстрактного механизма скрыты от его пользователей. Таким образом, разработчик реализации этого механизма, может в дальнейшем изменить внутренний код реализации, не оказав при этом какого-либо влияния на другие модули программы. Можно даже не ставить в известность о внесенных изменениях других программистов, занимающихся разработкой других модулей. При разработке классов в рамках модулей, как правило, они определяются в интерфейсном разделе модуля, однако существуют дополнительные ключевые слова, которые позволяют скрыть некоторые разделы этого определения класса.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 |


