Читайте также:
|
|
Программирование объектов в структурном программировании очень запутанная задача. Это привело к появлению нового стиля программирования – объектно-ориентированное. Это произошло в конце 80-х годов, когда в Паскале появилось понятие «объекты», а в Си – «класс». Начиная с 5 версии Паскаля, появляются объекты и библиотека. Это была попытка создать для Паскаля визуальную среду программирования – Turbo Vision. В Си доминировал Си + +.
Появление объектно-ориентированной парадигмы программирования неразрывно связано с созданием систем визуального программирования. Это связано с двумя процессами:
1) появлением графического интерфейса в ОС;
2) в этом интерфейсе появились пиктограммы – визуальные объекты, связанными с какими-то действиями.
Эти объекты имели набор свойств, которые можно было настраивать. Появилась необходимость провести аналогию между объектами ОС и объектами в программировании. Начался процесс автоматизации программирования, появились генераторы – программы, которые генерируют стандартные процедуры и функции в интерактивном режиме (управление работой с помощью мышки, окон и элементов ввода). Наиболее удобным интерфейсом для генератора стала среда визуального программирования.
Первоначально название типа и его значения в Паскале было одинаковым – object, что создавало путаницу при использовании и описании. Это дало основание для заимствования из языка Си понятия класс (class) для названия типа объектов. Поэтому в Object Pascal уже определена специальная пользовательская структура данных – класс.
Основная цель ООП повышение эффективности разработки программ. В традиционных методах программирования изменение данных или правил и методов их обработки часто приводило к необходимости значительного изменения программы, что приводило к увеличению вероятности ошибок и возрастает время, необходимое для отладки программы. Использование ООП позволяет выйти из такой ситуации с min потерями, сведя необходимую модификацию программы к её расширению и дополнению.
Понятие объекта в языках программирования реализовано, как совокупность свойств (структур данных, характерных для этого объекта), методов их обработки (программ изменения свойств) и событий, на который данный объект может реагировать, и они же приводят к изменению свойств объекта.
<Имя потомка> =
object<имя предка>
поле;
…
поле;
метод;
…
метод;
end;
Объекты могут иметь идентичную структуру и отличаться только значениями свойств. В таких случаях в программе создаётся новый тип, основанный на единой структуре объекта, он называется классом, а каждый конкретный объект, имеющий структуру этого класса – экземпляр класса. Класс имеет заранее заданные свойства. Класс знает, как решать определённые задачи, т.е. располагает методами решения. Но обычно класс не используется в программах. Класс является как бы шаблоном, на основе которого создаются экземпляры класса или объекты.
Элементами класса являются поля, методы и свойства. Поля – это данные, которые образуют значение нового типа данных. Методы – процедуры или функции, с помощью которых реализуются действия объекта. Свойства – это структура, которая обеспечивает ввод и вывод данных через специальные процедуры чтения и записи. Т.о. прямой доступ к полям запрещен, а значение полей можно изменять с помощью методов, либо с помощью процедур свойства. Поля разделены на связанные со свойствами и те, которые связаны с методами.
Класс является как бы шаблоном, на основе которого создаются экземпляры класса или объекты.
Программа, написанная с использованием ООП, состоит из объектов, которые могут взаимодействовать между собой. Основные понятиями, связанными с классами:
1) Инкапсуляции – объединение записей с процедурами и функциями, работающими с этими записями. Работа с данными и детали её реализации скрыты от внешнего пользователя объекта. Преимущества инкапсуляции заключается в модульности и изоляции кода объекта от другого кода программы.
Инкапсуляция –это скрытие полей внутри класса и оьъединение в классе информационных полей и процедур их обработки: методов и свойств.
По принципу инкапсуляции для обращения к информационным полям объета нужно либо использовать метод, либо сделать это поле свойством. Произвольный доступ к информационным полям как бы запрещён.
Такая защита информационных полей повышает надёжность работы объекта, а соединение информационных полей и процедур действия упрощает визуализацию программирования.
Т.о. объекты получают возможность реагировать на события и субытийно управляемое программирование упрощается.
Динамический характер объектов, классов, полей, свойств, методов позволяет во-первых более оптимально использовать память и убыстрять работу, а так же виртуализировать объекты.
Виртуальные объекты - это объекты, которые имеют несколько вариантов и в различной ситуации действуют разные варианты. Виртуальными делают свойства и методы, есть просто в виртуальные, а есть динамические.
Инкапсуляция имеет следующие достоинства:
1) объект класса, у которого есть методы, обладает особыми свойствами, которыми недоступны другим типам данных. Особенно удобны методы для описания действий самого объекта. Например, объект кошка может догонять, убегать, подпрыгивать и т.д. и все это можно сделать в виде методов.
2) скрытие полей и связь их с методами и свойствами повышает надежность работы объекта, так как ограничение мешает неквалифицированному пользователю неправильно использовать объект.
Возможность инкапсуляции появилась вместе с формированием процедурного типа данных, где элементом является процедура или функция определенного вида.
3) преимущества инкапсуляции заключается в модульности и изоляции кода объекта от другого кода программы.
2) Наследование – задание объекта, затем использование его для построения иерархии порожденных объектов с наследованием доступа каждого из порожденных объектов к коду и данным предка.
Возможность создания новых объектов, которые наследуют свойства и поведение родительских объектов. Это позволяет создавать иерархии объектов, включающие наборы объектов, порождённых от одного общего предка и обладающих всё большей специализацией и функциональностью по сравнению со своими предками, но использующие все возможности родительских классов. Преимущество наследования заключается в совместном использовании многими объектами общего кода.
Наследование- классы построены по принципу наследования, когда новый класс может быть объявлен наследником класса родитель(имя=class(имя родителя)) при этом он автоматически наследует все поля, свойства и методы родителя, что значительно упрощает программирование, в результате принято разрабатывать наследственную иерархию классов.
Построение такой иерархии-это нововведение.
При изучении различных объектов возникает проблема их описания в виде класса. В этой проблеме есть следующие характеристики:
1) часто объект достаточно сложен, что мешает спроектировать его свойства;
2) многие объекты подобны друг другу, но отличаются 2-3 свойствами. Неразумно дублировать их свойства при описании других классов.
Для решения данных проблем строят дерево наследования, начиная с определения корневого класса.
Главная идея при построении дерева наследования – это разделение свойств, методов и полей по уровням иерархии. Если дерево наследования уже существует, то изменение любого свойства или метода автоматически переносится на все потомки. После того, как определена структура иерархии наследования, можно приступать к проектированию. Проектирование берется от корня к листьям. Сначала проектируется корневой класс, а затем все ниже лежащие. Дерево наследования обладает свойством накопления, т.е. можно разрабатывать новые уровни иерархии, создавая новых потомков. При этом, в отличие от библиотек процедур и функций, необязательно помнить о тонкостях программирования выше лежащих классов.
Преимущество наследования заключается в совместном использовании многими объектами общего кода.
3) Полиморфизм – задание одного имени действию, которое передается вверх и вниз по иерархии объектов, с реализацией этого действия способом, соответствующим каждому объекту в иерархии. Означает «много форм». Это свойство объектов переопределять методы наследуемого класса. Это значит, что вызов метода объекта для переменной приведёт к выполнению кода, конкретного экземпляра класса, соответствующего данной переменной. Работает, главным образом, через указатели.
Полиморфизм может быть реализован перекрытием методов, созданием виртуальных и динамических методов. Перекрытие методов образуется при наследовании. Метод потомка с тем же именем перекрывает метод предка. Существуют перегружаемые методы, которые перегружаются по мере необходимости. Они имеют одно имя, но разное содержимое, хранятся в специальных таблицах. В зависимости от типа таблиц существуют виртуальные и динамические объекты. Наличие полиморфизма позволяет упростить, унифицировать и стандартизировать процедуры обработки событий, связанных с этими методами.
Понятие класса в языке ObjectPascal. Структура класса: поля, методы, свойства. Доступ к структурным элементам класса. Иерархия наследования классов. Конструктор и деструктор класса.
Понятие объекта в языках программирования реализовано, как совокупность свойств (структур данных, характерных для этого объекта), методов их обработки (программ изменения свойств) и событий, на который данный объект может реагировать, и они же приводят к изменению свойств объекта.
<Имя потомка> =
object<имя предка>
поле;
…
поле;
метод;
…
метод;
end;
Если объекты имеют идентичную структуру и отличаются только значениями свойств, то в таких случаях в программе создаётся новый тип, основанный на единой структуре объекта, он называется классом, а каждый конкретный объект, имеющий структуру этого класса- экземпляр класса. Класс имеет заранее заданные свойства. Класс знает, как решать определённые задачи, т.е. располагает методами решения. Но обычно класс не используется в программах. Класс является как бы шаблоном, на основе которого создаются экземпляры класса или объекты.
О. Класс – пользовательский тип данных, который по структуре подобен записи, но в качестве полей содержит специальные элементы – поля, методы и свойства.
Структура класса гораздо сложнее записи, поэтому внутри класса выделены специальные области:
Type
Имя класса = class (имя предка)
Published {Специальная область элементов, доступных для инспектора объектов}
…..
Private {Область закрытых элементов, доступных только внутри методов данного}
….. {класса и подпрограмм данного модуля, недоступны потомках}
Protected {Область закрытых элементов, доступных методам класса и его потомков}
…..
Public {Область элементов, доступных в любом модуле проекта}
…..
Automated {Секция автоматизации - элементы, необходимые для технологии OLE }
…..
end;
Каждый интерфейс обеспечивает следующие уровни доступа:
Private (закрытый). Объявленные переменные и методы доступны только для того кода, который находится в блоке реализации самого объекта. Директива Private скрывает особенности реализации объекта от пользователей и защищает члены этого объекта от доступа и изменения извне.
Protected (защищенный). Члены класса доступны объектам, производным от данного класса. Это позволяет скрыть внутреннее устройство объекта от пользователя и обеспечить необходимую гибкость, и эффективность доступа к полям и методам объекта для его потомков.
Public (скрытый). Члены объекта доступны в любом месте программы. Конструкторы и деструкторы всегда должны быть объявлены как public.
Published (экспортируемый). Для членов этого объекта в процессе компиляции будет создана информация о типах времени выполнения. Это позволит другим элементам приложения получать информацию об элементах объекта, объявленных как published.
При описании элементов структуры класса принято в начале задавать поля, затем методы и свойства.
О. Поле – элемент структуры, обозначающий хранение простых данных.
Поле (Fild) можно определить как переменную экземпляра, представляющие собой данные для объекта. Поле в объекте подобно полю в записи языка Pascal, но в отличии от записи, к полям в объекте обычно не разрешен прямой доступ. Это способствует защите полей от случайного или предумышленного искажения. Доступ к полям происходит через свойства, которые могут выступать как фильтры и не пропускать недопустимых значений. Объявление полей происходит как объявления обычных переменных, при этом поля чаще всего размещаются в закрытом интерфейсе класса, доступ к которому ограничен.
Поля имеют тип, обычно это стандартные типы (число, строка, знак, логический тип, массив). Но можно использовать и сложную структуру – например другой класс. Главная особенность поля – способ доступа к данным. Здесь разрешен прямой доступ к данным. Принцип инкапсуляции требует, чтобы к полям обращались только через свойства и методы, поэтому разумно размещать поля в областях Private и Protected. Класс потомок получает все поля всех своих предков и может дополнять их своими, но не может их переопределять (по сравнению например с методами) или удалять.
Замечание. Так же как и для полей записи обращение к полям возможно либо с помощью указания имени объекта, точки и имени поля (составное имя), либо с помощью структурного оператора with.
Методы представляют собой процедуры и функции, принадлежащие классу. Объявляются внутри описания объекта. Они определяют поведение класса.
procedure <Заголовок> (<Параметр1>, <Параметр2>: integer);
Объявление метода внутри объявления объектного типа содержит только заголовок. Тело метода определяется вне объявления объекта. Его заголовок дожжен содержать имя объекта, которому принадлежит метод.
procedure <ТипОбъекта.Метод> (<Параметр1>, <Параметр2>: integer);
begin
…
end;
Методы подразделяются на статические и виртуальные. Виртуальный метод отличается от статического тем, что реализующий его код подсоединяется к исполняемой программе не в процессе компиляции, а в процессе выполнения, что достигается поздним связыванием. Это дает возможность строить иерархию объектов с одинаковыми названиями методов, реализуемыми различными кодами.
При описании класса методы описываются в 2 этапа:
Заголовок метода помещается в ту или иную область описания класса.
Содержимое процедуры или функции метода размещается ниже области Type, где описывается структура класса. При этом указывается имя класса, точка и имя метода. Параметры можно не указывать, они уже описаны в заголовке метода (но при генерации метода описание параметров часто повторяют). Доступны внутри любого метода все поля, методы и свойства данного класса и некоторые элементы других классов.
В классе всегда должны присутствовать 2 важнейших метода: конструктор и деструктор.
Конструктор – метод, который создает конкретный объект - экземпляр класса. Деструктор – метод, который удаляет конкретный объект из памяти.
Конструктор – спец. метод, инициализирующий объект, содержащий виртуальные методы, он объявляется специально зарезервированным словом constructor. Он инициализирует объект путем установления связи между объектом и специальной таблицей виртуальных методов, содержащей адреса кодов, реализующих Вирт. методы. Может использоваться для инициализации полей данных объекта.
Деструктор – спец. метод, освобождающий память «кучи» (Вся динамическая память рассматривается как подобная стеку структура, называемая кучей) от динамических объектов. Использует слово destructor.
При проектировании класса можно создать произвольное кол-во др. методов, необходимых для решения конкретных задач.
Перегрузка методов. Методы могут быть перегружены так, чтобы класс содержал несколько методов с одним именем, но с различными списками параметров. Перегруженные методы должны быть объявлены с указанием директивы overload.
Свойства (Property) представляют собой сущности, обеспечивающие доступ к данным и коду, содержащемуся в классе, тем самым избавляя конечного пользователя от деталей реализации класса. По отношению к компонентам свойства являются теми элементами, сведения о которых отображаются в инспекторе объектов.
О. Свойства – поле процедурного типа. Свойства должны регулировать доступ к полям. Для этого у каждого свойства есть поле и 2 метода – чтения (read) и записи (write). Обычно свойство связано с полем и указывает те методы класса, которые обеспечивают чтение значения из поля и запись нового значения в поле. Формат записи заголовка свойства:
Property имя свойства: тип Read метод чтения из поля Write метод записи в поле Default значение по умолчанию;
При работе программы свойство используется как обычное поле, но фактически ввод и чтение данных возможно только через указанные процедуры-методы. Если нет необходимости в специальных методах, то можно указывать вместо процедуры (метода) имя поля. Если поле доступно только для чтения то не указывается метод записи и наоборот. Значение по умолчанию присваивается полю свойства, если оно не было определено (что удобно для инициализации объекта). Принято имя метода чтения начинать с Get, а метода записи с Set. Для того чтобы свойство было доступно инспектору объектов его необходимо поместить в область Pablished.
Наследование. – возможность создания новых объектов, которые наследуют свойства и поведение родительских объектов. Это позволяет создавать иерархии объектов, включающие наборы объектов, порождённых от одного общего предка и обладающих всё большей специализацией и функциональностью по сравнению со своими предками, но использующие все возможности родительских классов. Преимущество наследования заключается в совместном использовании многими объектами общего кода.
Дата добавления: 2015-07-11; просмотров: 205 | Нарушение авторских прав