Основные свойства ООП: инкапсуляция и полиморфизм
Инкапсуляция — один из важнейших механизмов объектно-ориентированного программирования (наряду с наследованием и полиморфизмом). Класс представляет собой единство трёх сущностей: полей, свойств и методов, что и представляет собой инкапсуляцию.
Инкапсуляция позволяет создавать класс как нечто целостное, имеющее определенную функциональность. Например, класс TForm содержит в себе (инкапсулирует) всё необходимое, чтобы создать диалоговое окно.
Основная идея инкапсуляции — защитить поля от несанкционированного доступа. Поэтому поля целесообразно объявлять в разделе private. Прямой доступ к полям объекта — чтение и обновление их содержимого — должны производиться посредством вызова соответствующих методов. В FreePascal для этого служат свойства класса.
Свойства — это специальный механизм классов, регулирующий доступ к полям. Свойства объявляются с помощью зарезервированных слов property, read и write. Обычно свойство связано с некоторым полем и указывает те методы класса, которые должны использоваться при записи в это поле или при чтении из него. Синтаксис объявления свойств следующий:
property имя_свойства: тип read имя_чтения wгite имя_записи
Зарезервированное слово read описывает метод чтения свойств объекта, а слово write описывает метод записи свойств объекта.
Имя чтения и имя_записи — соответственно имена методов, обеспечивающих чтение или запись свойства.
Если необходимо, чтобы свойство было доступно только для чтения или только для записи, следует опустить соответственно часть write или read.
|
|
Второй основополагающей составляющей объектно-ориентированного программирования является наследование. Смысл наследования заключается в следующем: если нужно создать новый класс, лишь немного отличающийся от старого, то нет необходимости в переписывании заново уже существующих полей и методов. В этом случае объявляется новый класс, который является наследником уже имеющегося, и к нему добавляются новые поля, методы и свойства. При создании новый класс является наследником членов ранее определённого базового класса (родителя). Класс-наследник является производным от базового, причём он сам может выступать в качестве базового класса для вновь создаваемых классов.
В Object Pascalвсе классы являются потомками класса TObject. Поэтому если вы создаёте дочерний класс непосредственно от класса TObject, то в определении его можно не упоминать.
Методы классов. Полиморфизм
Производный класс наследует от класса-предка поля и методы. Если имеет место совпадения имен методов, то говорят, что они перекрываются. В зависимости от того, какие действия происходят при вызове, методы делятся на следующие группы:
|
|
- статические методы;
- виртуальные методы;
- динамические;
По умолчанию все методы статические. Эти методы полностью перекрываются в классах-потомках при их переопределение. При этом можно полностью изменить объявление метода. Если обращаться к такому методу у объекта базового класса, то будет работать метод класса-родителя. Если обращаться к методу у производного класса, то будет работать новый метод.
Виртуальные и динамические методы имеют в базовом и производном классе те же имена и типы. В классах-наследниках эти соответственно и вызывается метод этого класса.
Основная разница между виртуальными и динамическими методами - в способе их вызова. Информация о виртуальных методах хранится в таблице виртуальных методов VMT. В VMT хранятся виртуальные методы данного класса и всех его предков. При создании потомка класса вся VMT предка переносится в потомок и там к ней добавляются новые методы. Поиск нужного метода сначала занимает мало времени, так как класс имеет всю информацию о своих виртуальных методах. Динамические методы не дублируются в таблице динамических методов DMT потомка. DMT класса содержит только методы, объявленные в этом классе. При вызове динамического метода сначала осуществляется поиск в DMT данного класса, и если метод не найден - то в DMT предка класса и т.д
|
|
Таким образом, использование виртуальных методов требует больший расход памяти из-за необходимости хранения массивных VMT всех классов, зато они вызываются быстрее.
Изменяя алгоритм того или иного метода в производных классах, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перегрузить его в потомке, т.е объявить в наследнике одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу. Это называется полиморфизмом объектов.
Виртуальные и динамические методы объявляются так же, как и статические, только в конце описания метода добавляются служебные слова virtualили dynamic:
Type
имя _класса_родителя= class
метод; virtual;
end;
Чтобы перегрузить в классе-наследнике виртуальный метод, нужно после его объявления написать ключевое слово override:
end;
имя_класса_наследника= class; (имя_класса_родителя)
метод; override;
|
|
end;
Абстрактный метод - это виртуальный вид или динамический метод, реализация которого не определена в том классе, где он объявлен. Предполагается, что этот метод будет перезагружен в классе-наследника. Вызывают метод только в тех классах, где он перезагружен. Абстрактный метод объявляются при помощи служебного слова abstract после слов virtualили dynamic.
Перезагрузка операций
В FreePascalможно перезагрузить не только функции, но и операции. Например, можно запрограммировать, чтобы операция * при работе с матрицами осуществляла умножение матриц, а при работе с комплексными числами - умножение комплексных чисел.
Для этого в программе нужно написать специальную функцию - метод. Объявление методы перегрузки записывается после объявления класса и выглядит так:
operator symbols(параметры: тип) имя_переменной_результата:
тип;
где
- operator -служебное слово;
- symbols -символ перезагружаемой операции;
- параметры - имена переменных, участвующих в перезагрузке оператора.
Описывают метод перезагрузки так же, как и другие методы, после ключевого слова implemention того модуля, в котором объявлен класс.
Компоненты - это особый вид объектов - визуальных компонентов. Библиотека визуальных компонентов (Visual Component Library, VCL) содержит больщое количество классов, предназначенных для быстрой разработки приложений. Библиотека написана на Object Pascal и имеет непосредственную связь с интегрированной средой разработки приложений Delphi. В VCL содержатся не визуальные и визуальные компоненты, а так же другие классы, начиная с абстрактного класса TObject. При этом все компоненты являются классами, но не все классы являются компонентами. Все классы VCL расположены на определенном уровне иерархии и образуют дерево (иерархию) классов.
Дата добавления: 2018-04-05; просмотров: 438; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!