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

Объе́ктно-ориенти́рованное или объектное программи́рование (в дальнейшем ООП) —парадигма программирования, в которой основными концепциями являются понятияобъектов и классов (либо, в менее известном варианте языков с прототипированием, —прототипов).

Абстракция 

Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция – это набор всех таких характеристик.

Инкапсуляция 

Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

Наследование 

Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым или родительским. Новый класс – потомком, наследником или производным классом.

Полиморфизм 

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Три кита ооп

Весь мир ООП держится на трех китах: инкапсуляции, наследовании и полиморфизме. Для начала о них надо иметь только самое общее представление.

Объединение данных и операций в одну сущность — объект — тесно связано с понятием инкапсуляции, которое означает сокрытие внутреннего устройства. Инкапсуляция делает объекты похожими на маленькие программные модули, в которых скрыты внутренние данные и у которых имеется интерфейс использования в виде подпрограмм. Переход от понятий «структура данных» и «алгоритм» к понятию «объект» значительно повысил ясность и надежность программ.

Второй кит ООП — наследование. Этот простой принцип означает, что если вы хотите создать новый класс объектов, который расширяет возможности уже существующего класса, то нет необходимости в переписывании заново всех полей, методов и свойств. Вы объявляете, что новый класс является потомком (или дочерним классом) имеющегося класса объектов, называемого предком (или родительским классом), и добавляете к нему новые поля, методы и свойства. Процесс порождения новых классов на основе других классов называется наследованием. Новые классы объектов имеют как унаследованные признаки, так и, возможно, новые. Например, класс СОБАКИ унаследовал многие свойства своих предков — ВОЛКОВ.

Третий кит — это полиморфизм. Он означает, что в производных классах вы можете изменять работу уже существующих в базовом классе методов. При этом весь программный код, управляющий объектами родительского класса, пригоден для управления объектами дочернего класса без всякой модификации. Например, вы можете породить новый класс кнопок с рельефной надписью, переопределив метод рисования кнопки. Новую кнопку можно "подсунуть" вместо стандартной в какую-нибудь подпрограмму, вызывающую рисование кнопки. При этом подпрограмма "думает", что работает со стандартной кнопкой, но на самом деле кнопка принадлежит производному классу кнопок и отображается в новом стиле. Пока достаточно самого поверх

Как уже говорилось выше, в современных объектно-ориентированных языках программирования каждый объект является значением, относящимся к определённому классу. Класс представляет собой объявленный программистом составной тип данных, имеющий в составе:

Поля данных

Параметры объекта (конечно, не все, а только необходимые в программе), задающие его состояние (свойства объекта предметной области). Иногда поля данных объекта называют свойствами объекта, из-за чего возможна путаница. Физически поля представляют собой значения (переменные, константы), объявленные как принадлежащие классу.

Методы 

Процедуры и функции, связанные с классом. Они определяют действия, которые можно выполнять над объектом такого типа, и которые сам объект может выполнять.

Классы могут наследоваться друг от друга. Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными либо переопределять уже имеющиеся. Большинство языков программирования поддерживает только единичное наследование (класс может иметь только один класс-родитель), лишь в некоторых допускается множественное наследование — порождение класса от двух или более классов-родителей. Множественное наследование создаёт целый ряд проблем, как логических, так и чисто реализационных, поэтому в полном объёме его поддержка не распространена. Вместо этого в 1990-е годы появилось и стало активно вводиться в объектно-ориентированные языки понятие интерфейса. Интерфейс — это класс без полей и без реализации, включающий только заголовки методов. Если некий класс наследует (или, как говорят, реализует) интерфейс, он должен реализовать все входящие в него методы. Использование интерфейсов предоставляет относительно дешёвую альтернативу множественному наследованию.

Взаимодействие объектов в абсолютном большинстве случаев обеспечивается вызовом ими методов друг друга.

Инкапсуляция обеспечивается следующими средствами

Контроль доступа 

Поскольку методы класса могут быть как чисто внутренними, обеспечивающими логику функционирования объекта, так и внешними, с помощью которых взаимодействуют объекты, необходимо обеспечить скрытость первых при доступности извне вторых. Для этого в языки вводятся специальные синтаксические конструкции, явно задающие область видимости каждого члена класса. Традиционно это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные только из классов-потомков и скрытые, доступные только внутри класса. Конкретная номенклатура модификаторов и их точный смысл различаются в разных языках.

Методы доступа 

Поля класса, в общем случае, не должны быть доступны извне, поскольку такой доступ позволил бы произвольным образом менять внутреннее состояние объектов. Поэтому поля обычно объявляются скрытыми (либо язык в принципе не позволяет обращаться к полям класса извне), а для доступа к находящимся в полях данным используются специальные методы, называемые методами доступа. Такие методы либо возвращают значение того или иного поля, либо производят запись в это поле нового значения. При записи метод доступа может проконтролировать допустимость записываемого значения и, при необходимости, произвести другие манипуляции с данными объекта, чтобы они остались корректными (внутренне согласованными). Методы доступа называют ещё аксессорами (от англ. access — доступ), а по отдельности — геттерами (англ. get — чтение) и сеттерами (англ. set — запись)[2].

Свойства объекта 

Псевдополя, доступные для чтения и/или записи. Свойства внешне выглядят как поля и используются аналогично доступным полям (с некоторыми исключениями), однако фактически при обращении к ним происходит вызов методов доступа. Таким образом, свойства можно рассматривать как «умные» поля данных, сопровождающие доступ к внутренним данным объекта какими-либо дополнительными действиями (например, когда изменение координаты объекта сопровождается его перерисовкой на новом месте). Свойства, по сути — не более чем синтаксический сахар, поскольку никаких новых возможностей они не добавляют, а лишь скрывают вызов методов доступа. Конкретная языковая реализация свойств может быть разной. Например, вC# объявление свойства непосредственно содержит код методов доступа, который вызывается только при работе со свойствами, то есть не требует отдельных методов доступа, доступных для непосредственного вызова. В Delphi объявление свойства содержит лишь имена методов доступа, которые должны вызываться при обращении к полю. Сами методы доступа представляют собой обычные методы с некоторыми дополнительными требованиями к сигнатуре.

Полиморфизм реализуется путём введения в язык правил, согласно которым переменной типа «класс» может быть присвоен объект любого класса-потомка её класса.

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.

Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т. е. объекта.

Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (исвязывания) исходного кода на выполнение).

Прототип — это объект-образец, по образу и подобию которого создаются другие объекты.

Объекты (Objects). Основной единицей в объектно-ориентированном программировании является программный объект, который объединяет в себе как описывающие его данные (свойства), так и средства обработки этих данных (методы). Если говорить образно, то объекты – это существительные,  свойства объекта – это прилагательные, а методы объекта – это глаголы.

 

!

Программные объекты обладают свойствами, могут использовать методы и реагируют на события.

 

Классы объектов являются «шаблонами», определяющими наборы свойств, методов и событий по которым создаются объекты. Основными классами объектов являются объекты, реализующие графический интерфейс проектов.

Объект, созданный по «шаблону» класса объектов, является экземпляром класса и наследует весь набор свойств, методов и событий данного класса. Каждый экземпляр класса имеет уникальное для данного класса имя. Различные экземпляры класса обладают одинаковым набором свойств, однако значения свойств у них могут отличаться.

 

Свойства объектов (Properties). Каждый объект обладает определенным набором свойств, первоначальные значения которых можно установить с использованием диалогового окна системы программирования.

Значения свойств объектов можно изменять в программном коде. Для присвоения свойству объекта нового значения в левой части строки программного кода необходимо указать имя объекта и затем название свойства, которые в соответствие с правилами точечной нотации между собой разделяются точкой. В правой части строки необходимо записать конкретное значение свойства:

 

!

Объект.Свойство = ЗначениеСвойства                      

 

Методы объектов (Methods). Для того чтобы объект выполнил какую-либо операцию, необходимо применить метод, которым он обладает. Многие методы имеют аргументы, которые позволяют задать параметры выполняемых действий. Для присваивания аргументам конкретных значений используется двоеточие и знак равенства, а между собой аргументы отделяются запятой.

Обратиться к методу объекта можно также с использованием точечной нотации. Чтобы определить, для какого объекта вызывается метод, перед именем метода указывается имя объекта, отделенное точкой:

 

!

Объект.Метод арг1:=значение, арг2:=значение                     

 

События (Events). Событие представляет собой действие, распознаваемое объектом. Событие может создаваться пользователем (например, щелчок мышью или нажатие клавиши) или быть результатом воздействия других программных объектов. В качестве реакции на события вызывается определенная процедура, которая может изменять свойства объекта, вызывать его методы и т.д.

Операции с объектами

Этот вид редактирования исключает использование инструмента Range Selection  . Рассмотрим операции с объектами. Перемещение Самый простой способ реализуется перетаскиванием объекта или группы выделенных объектов с помощью инструмента Object Selection (

Копирование Самый простой способ копирования — это перетаскивание объекта (или выделенной группы) с нажатой клавишей <Alt> инструментом Object Selection. Остальные методы копирования связаны с командами меню Edit.

  • Duplicate (комбинация клавиш <Ctrl>+<D>) — дублирование выделенного объекта или группы. При этом копия объекта располагается сразу после оригинала, стыкуясь с его границей. 

Repeat (комбинация клавиш <Ctrl>+<K>) — функция многократного дублирования.

Переименование По умолчанию имя аудиособытия указывает на Audio Clip в соответствии с внутренней ссылкой. Но при необходимости пользователь может переименовать выделенный объект. Делается это в поле Description на панели Info Line. Переименованный объект Audio Event будет содержать в скобках название глобальной ссылки.

Склеивание

Склеивание производится с помощью инструмента Glue (клей)   в направлении от начала мультитрека. Операция склеивания имеет двоякий результат в зависимости от предыстории редактирования 

Группирование Выделенные объекты можно сгруппировать командой Edit | Group. С точки зрения редактирования группа ведет себя как отдельный объект, т. е. операции редактирования применяются одновременно ко всем объектам группы. Объекты, входящие в группу, помечаются символом g. Сгруппированные объекты разъединяются командой Edit | Ungroup.

Блокирование объектов Для защиты от случайного редактирования объекты можно заблокировать. Блокировка выделенных объектов осуществляется с помощью команды Edit | Lock. Для разблокирования предусмотрена команда обратного действия Unlock. В зависимости от дополнительных настроек Preferences (рис. 2.106) объекты могут блокироваться по нескольким признакам:

  • Position — защита от перемещения;

  • Size — защита от смещения границ;

  • Other — защита от всех остальных видов редактирования, включая деструктивный фейд, деструктивное редактирование с обработкой plug-ins и т. д.

Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов класса.

В языке Delphi ограничение доступа к полям объекта реализуется при помощи свойств объекта. Свойство объекта характеризуется полем, сохраняющим значение свойства, и двумя методами, обеспечивающими доступ к полю свойства. Метод установки значения свойства называется методом записи свойства (write), а метод получения значения свойства — методом чтения свойства (read).

В описании класса перед именем свойства записывают слово property (свойство). После имени свойства указывается его тип, затем — имена методов, обеспечивающих доступ к значению свойства. После слова read указывается имя метода, обеспечивающего чтение свойства, после слова write — имя метода, отвечающего за запись свойства.

Ниже приведен пример описания класса TPerson, содержащего два свойства: Name И Address.

type

TName = string[15]; TAddress = string[35];

TPerson = class // класс

private

FName: TName; // значение свойства Name

FAddress: TAddress; // значение свойства Address

Constructor Create(Name:Tname);

Procedure Show;

Function GetName: TName;

Function GetAddress: TAddress;

Procedure SetAddress(NewAddress:TAddress);

public

Property Name: Tname // свойство Name

read GetName; // доступно только для чтения

Property Address: TAddress // свойство Address

read GetAddress // доступно для чтения

write SetAddress; // и записи

end;

В программе для установки значения свойства не нужно записывать инструкцию применения к объекту метода установки значения свойства, а надо записать обычную инструкцию присваивания значения свойству. Например, чтобы присвоить значение свойству Address объекта student, достаточно записать

student.Address := 'С.Петербург,

ул.Садовая 21, кв.3';

Компилятор перетранслирует приведенную инструкцию присваивания значения свойству в инструкцию вызова метода

student.SetAddress('С.Петербург,

ул.Садовая 21, кв.3');

Внешне применение свойств в программе ничем не отличается от использования полей объекта. Однако между свойством и полем объекта существует принципиальное отличие: при присвоении и чтении значения свойства автоматически вызывается процедура, которая выполняет некоторую работу.

В программе на методы свойства можно возложить некоторые дополнительные задачи. Например, с помощью метода можно проверить корректность присваиваемых свойству значений, установить значения других полей, логически связанных со свойством, вызвать вспомогательную процедуру.

Оформление данных объекта как свойства позволяет ограничить доступ к полям, хранящим значения свойств объекта: например, можно разрешить только чтение. Для того чтобы инструкции программы не могли изменить значение свойства, в описании свойства надо указать лишь имя метода чтения. Попытка присвоить значение свойству, предназначенному только для чтения, вызывает ошибку времени компиляции. В приведенном выше описании класса TPerson свойство Name доступно только для чтения, а свойство Address — для чтения и записи.

Установить значение свойства, защищенного от записи, можно во время инициализации объекта. Ниже приведены методы класса TPerson, обеспечивающие создание объекта класса TPerson и доступ к его свойствам.

// конструктор объекта TPerson

Constructor TPerson.Create(Name:TName);

begin

FName:=Name; end;

// метод получения значения свойства Name

Function TPerson.GetName;

begin

Result:=FName; end;

// метод получения значения свойства Address

function TPerson.GetAddress;

begin

Result:=FAddress; end;

// метод изменения значения свойства Address

Procedure TPerson.SetAddress(NewAddress:TAddress);

begin

if FAddress =' '

then FAddress := NewAddress;

end;

Приведенный конструктор объекта TPerson создает объект и устанавливает значение поля FName, определяющего значение свойства Name.

Инструкции программы, обеспечивающие создание объекта класса трегзоп и установку его свойства, могут быть, например, такими:

student := TPerson.Create('Иванов');

student.Address := 'ул. Садовая, д.3, кв.25';