Основы объектно-ориентированного программирования
Оценка 5

Основы объектно-ориентированного программирования

Оценка 5
Научно-исследовательская работа +4
docx
информатика
Взрослым
17.02.2017
Основы объектно-ориентированного программирования
Введение в объектно-ориентированное программирование Объектно-ориентированное программирование (ООП) — это способ организации кода в программе путем его группировки в виде объектов, то есть отдельных элементов, которые включают информацию (значения данных) и функции. Объектно-ориентированный подход к организации программы позволяет группировать определенные фрагменты информации (например, музыкальную информацию, такую как название альбома, название трека или имя исполнителя) вместе с часто используемыми функциями или действиями, связанными с этой информацией (например, «добавить трек в список воспроизведения» или «воспроизвести все песни этого исполнителя»). Эти элементы объединяются в один элемент, так называемый объект (например, «Album» или «MusicTrack»). Возможность связать вместе эти значения и функции дает несколько преимуществ. Например, нужно отслеживать только одну переменную, а не несколько; можно сгруппировать вместе связанные между собой функции; можно организовать структуру программы так, чтобы она больше соответствовала реальным потребностям.
Основы объектно.docx
Основы объектно­ориентированного программирования. Содержание.  Введение в объектно­ориентированное программирование  Общие операции в объектно­ориентированном программировании  Важные понятия и термины  Работа с примерами из главы Введение в объектно­ориентированное программирование Объектно­ориентированное программирование (ООП) — это способ организации кода в  программе путем его группировки в виде объектов, то есть отдельных элементов, которые  включают информацию (значения данных) и функции. Объектно­ориентированный подход к  организации программы позволяет группировать определенные фрагменты информации  (например, музыкальную информацию, такую как название альбома, название трека или имя  исполнителя) вместе с часто используемыми функциями или действиями, связанными с этой информацией (например, «добавить трек в список воспроизведения» или «воспроизвести все песни этого исполнителя»). Эти элементы объединяются в один элемент, так называемый  объект (например, «Album» или «MusicTrack»). Возможность связать вместе эти значения и  функции дает несколько преимуществ. Например, нужно отслеживать только одну  переменную, а не несколько; можно сгруппировать вместе связанные между собой функции;  можно организовать структуру программы так, чтобы она больше соответствовала реальным потребностям. Общие операции в объектно­ориентированном программировании На практике объектно­ориентированное программирование делится на две части. Одна  часть включает стратегии и приемы для разработки программ (или объектно­ ориентированного дизайна). Это большая тема, и поэтому мы не будет обсуждать ее в этой  главе. Вторая часть ООП — это собственно структуры программирования, доступные в  данном языке программирования для создания программы с использованием объектно­ ориентированного подхода. В этой главе описываются следующие общие операции в ООП:  определение классов;  создание свойств, методов, а также методов доступа get и set;  управление доступом к классам, свойствам, методам и методам доступа;  создание статических свойств и методов;  создание структур с перечислением;  определение и использование интерфейсов;  работа с наследованием, включая переопределение элементов класса. Важные понятия и термины Ниже приводится список важных терминов, с которыми вы столкнетесь в этой главе.  Атрибут — это характеристика, назначенная элементу класса (например, свойству  или методу) в определении класса. Атрибуты часто используются для определения  того, будет ли свойство (или метод) доступно для кода в других частях программы.  Например, private (закрытый) и public (открытый) — это атрибуты. Закрытый метод  может вызываться только кодом внутри класса, а открытый метод может вызываться  любым кодом в программе.  Класс — это определение структуры и поведения объектов определенного типа (как  шаблон или схема объектов для этого типа данных).  Иерархия классов — это структура многочисленных связанных классов,  определяющая, какие классы наследуют функции от других классов.  Конструктор — это особый метод, определяемый в классе, который вызывается при  создании экземпляра класса. Конструкторы обычно используются для определения  значений по умолчанию или для выполнения других операций по настройке объекта.  Тип данных — это тип информации, который может хранить та или иная переменная.  Как правило, термин тип данных имеет то же значение, что и класс.  Оператор «точка» — это знак точки (.), который в ActionScript (и многих других  языках программирования) служит для указания того, что имя относится к дочернему  элементу объекта (например, к свойству или методу). Например, в  выражении myObject.myProperty оператор «точка» указывает на то, что  термин myProperty ссылается на какое­то значение, являющееся элементом объекта с  именем myObject.  Перечисление — это набор связанных констант, сгруппированных вместе для  удобства в качестве свойств одного класса.  Наследование — это механизм ООП, позволяющий определению одного класса  включать все функции определения другого класса (и, как правило, расширять эти  функции).  Экземпляр — фактический объект, созданный в программе.  Пространство имен — это, главным образом, пользовательский атрибут,  обеспечивающий более полный контроль над тем, какой код может получить доступ к  другому коду. Работа с примерами из главы Прорабатывая главу, вы можете самостоятельно тестировать приведенные в ней примеры  кодов. Так как коды, приведенные в этой главе, в основном, предназначены для определения данных и манипуляциями с ними, тестирование примеров включает создание экземпляра  определяемого класса, выполнение манипуляций с использованием его свойств и методов, а  затем просмотр значений свойств этого экземпляра. Для просмотра этих значений  необходимо занести их в экземпляр текстового поля в рабочей области или напечатать  значения на панели «Вывод» с помощью функции trace(). Эти приемы подробно описаны в  разделе Тестирование примеров кода. ее ие Объ ктно­ориент рованное программ рование (ООП) программирования, в которой основнымиконцепциями являются  понятия объектов и классов. В случае языков с прототипированием вместо классов  используются объекты­прототипы.  — парадигма  ие ООП возникло в результате развития идеологии процедурного программирования, где  данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Для  дальнейшего развития объектно­ориентированного программирования часто большое  значение имеют понятия события (так называемое событийно­ориентированное  программирование) и компонента (компонентное программирование, КОП). Взаимодействие объектов происходит посредством сообщений. Результатом дальнейшего  развития ООП, по­видимому, будет агентно­ориентированое программирование,  где агенты — независимые части кода на уровне выполнения. Взаимодействие агентов  происходит посредством изменения среды, в которой они находятся. Языковые конструкции, конструктивно не относящиеся непосредственно к объектам, но  сопутствующие им для их безопасной (исключительные ситуации, проверки) и эффективной  работы, инкапсулируются от них в аспекты (в аспектно­ориентированном  программировании). Субъектно­ориентированное программирование расширяет понятие  объекта посредством обеспечения более унифицированного и независимого взаимодействия  объектов. Может являться переходной стадией между ООП и агентным программированием в части самостоятельного их взаимодействия. Первым языком программирования, в котором были предложены принципы объектной  ориентированности, была Симула. В момент его появления в 1967 году в нём были  предложены революционные идеи: объекты, классы, виртуальные методы и др., однако это  всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство  концепций были развиты Аланом Кэем и Дэном Ингаллсом в языке Smalltalk. Именно он  стал первым широко распространённым объектно­ориентированным языком  программирования. В настоящее время количество прикладных языков программирования (список языков),  реализующих объектно­ориентированную парадигму, является наибольшим по отношению к  другим парадигмам. В области системного программирования до сих пор применяется  парадигма процедурного программирования, и общепринятым языком программирования  является Cи. При взаимодействии системного и прикладного уровней операционных систем  заметное влияние стали оказывать языки объектно­ориентированного программирования.  Например, одной из наиболее распространённых библиотек мультиплатформенного  программирования является объектно­ориентированная библиотека Qt, написанная на  языке C++. Основные понятия[править | править вики­текст] В этом разделе не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть  поставлена под сомнение и удалена. Вы можете отредактировать эту статью, добавив ссылки  на авторитетные источники. Эта отметка установлена 18 октября 2012. Абстракция Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая  из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких  характеристик.[1] Инкапсуляция  Инкапсуляция — это свойство системы, позволяющее объединить данные и методы,  работающие с ними, в классе, и скрыть детали реализации от пользователя.[1] Наследование  Наследование — это свойство системы, позволяющее описать новый класс на основе уже  существующего с частично или полностью заимствующейся функциональностью. Класс, от  которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.[1] Полиморфизм  Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом  без информации о типе и внутренней структуре объекта.[1] При использовании термина  «полиморфизм» в сообществе ООП подразумевается полиморфизм подтипов; а  использование параметрического полиморфизманазывают обобщённым программированием. Класс  Класс является описываемой на языке терминологии исходного кода моделью ещё не  существующей сущности (объекта). Фактически он описывает устройство объекта, являясь  своего рода чертежом. Говорят, что объект — это экземпляр класса. При этом в некоторых  исполняющих системах класс также может представляться некоторым объектом при  выполнении программы посредством динамической идентификации типа данных. Обычно  классы разрабатывают таким образом, чтобы их объекты соответствовали объектам  предметной области. Объект  Сущность в адресном пространстве вычислительной системы, появляющаяся при создании  экземпляра класса или копирования прототипа (например, после запуска  результатов компиляции и связывания исходного кода на выполнение). Прототип Прототип — это объект­образец, по образу и подобию которого создаются другие объекты.  Объекты­копии могут сохранять связь с родительским объектом, автоматически наследуя  изменения в прототипе; эта особенность определяется в рамках конкретного языка. Определение ООП и его основные концепции[править | править вики­текст] В центре ООП находится понятие объекта. Объект — это сущность, которой можно  посылать сообщения и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта скрыты от остальной программы. Сокрытие данных  называется инкапсуляцией. Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не  означает его объектной ориентированности — для этого требуется наличиенаследования. Но даже наличие инкапсуляции и наследования не делает язык программирования в полной  мере объектным с точки зрения ООП. Основные преимущества ООП проявляются только в  том случае, когда в языке программирования реализован полиморфизм подтипов —  возможность единообразно обрабатывать объекты с различной реализацией при условии  наличия общего интерфейса. Сложности определения[править | править вики­текст] В этой статье или разделе имеется избыток  цитат либо слишком длинные цитаты. Излишние и чрезмерно большие цитаты следует обобщить и переписать своими словами. Возможно, эти цитаты будут более уместны  в Викицитатнике или в Викитеке. ООП имеет уже более чем сорокалетнюю историю, но, несмотря на это, до сих пор не  существует чёткого общепринятого определения данной технологии[2]. Основные принципы,  заложенные в первые объектные языки и системы, подверглись существенному изменению  (или искажению) и дополнению при многочисленных реализациях последующего времени.  Кроме того, примерно с середины 1980­х годов термин «объектно­ориентированный»  стал модным, в результате с ним произошло то же самое, что несколько раньше с термином  «структурный» (ставшим модным после распространения технологии структурного  программирования) — его стали искусственно «прикреплять» к любым новым разработкам,  чтобы обеспечить им привлекательность. Бьёрн Страуструп в 1988 году писал, что  обоснование «объектной ориентированности» чего­либо, в большинстве случаев, сводится к ложному силлогизму: «X — это хорошо. Объектная ориентированность — это  хорошо.Следовательно, X является объектно­ориентированным». Тимоти Бадд пишет[3][4]: Роджер Кинг аргументированно настаивал, что его кот является объектно­ ориентированным. Кроме прочих своих достоинств, кот демонстрирует характерное  поведение, реагирует на сообщения, наделён унаследованными реакциями и управляет  своим, вполне независимым, внутренним состоянием. По мнению Алана Кея, создателя языка Smalltalk, которого считают одним из «отцов­ основателей» ООП, объектно­ориентированный подход заключается в следующем наборе  основных принципов (цитируется по вышеупомянутой книге Т. Бадда). 1. Всё является объектом. 2. Вычисления осуществляются путём взаимодействия (обмена данными) между  объектами, при котором один объект требует, чтобы другой объект выполнил  некоторое действие. Объекты взаимодействуют, посылая и получая сообщения.  Сообщение — это запрос на выполнение действия, дополненный набором аргументов,  которые могут понадобиться при выполнении действия. 3. Каждый объект имеет независимую память, которая состоит из других объектов. 4. Каждый объект является представителем класса, который выражает общие свойства  объектов (таких, как целые числа или списки). 5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты,  которые являются экземплярами одного класса, могут выполнять одни и те же  действия. 6. Классы организованы в единую древовидную структуру с общим корнем, называемую  иерархией наследования. Память и поведение, связанное с экземплярами  определённого класса, автоматически доступны любому классу, расположенному  ниже в иерархическом дереве. Таким образом, программа представляет собой набор объектов, имеющих состояние и  поведение. Объекты взаимодействуют посредством сообщений. Естественным образом  выстраивается иерархия объектов: программа в целом — это объект, для выполнения своих  функций она обращается к входящим в неё объектам, которые, в свою очередь, выполняют  запрошенное путём обращения к другим объектам программы. Естественно, чтобы избежать  бесконечной рекурсии в обращениях, на каком­то этапе объект трансформирует обращённое к нему сообщение в сообщения к стандартным системным объектам, предоставляемым  языком и средой программирования. Устойчивость и управляемость системы обеспечивается за счёт чёткого разделения  ответственности объектов (за каждое действие отвечает определённый объект),  однозначного определения интерфейсов межобъектного взаимодействия и полной  изолированности внутренней структуры объекта от внешней среды (инкапсуляции). Определить ООП можно и многими другими способами[5]. Концепции[править | править вики­текст] Появление в ООП отдельного понятия класса закономерно вытекает из желания иметь  множество объектов со сходным поведением. Класс в ООП — это в чистом  видеабстрактный тип данных, создаваемый программистом. С этой точки зрения объекты  являются значениями данного абстрактного типа, а определение класса задаёт внутреннюю  структуру значений и набор операций, которые над этими значениями могут быть  выполнены. Желательность иерархии классов (а значит, наследования) вытекает из  требований к повторному использованию кода — если несколько классов имеют сходное  поведение, нет смысла дублировать их описание, лучше выделить общую часть в общий  родительский класс, а в описании самих этих классов оставить только различающиеся  элементы. Необходимость совместного использования объектов разных классов, способных  обрабатывать однотипные сообщения, требует поддержки полиморфизма — возможности  записывать разные объекты в переменные одного и того же типа. В таких условиях объект,  отправляя сообщение, может не знать в точности, к какому классу относится адресат, и  одни и те же сообщения, отправленные переменным одного типа, содержащим объекты  разных классов, вызовут различную реакцию. Отдельного пояснения требует понятие обмена сообщениями. Первоначально (например, в  том же Smalltalk) взаимодействие объектов представлялось как «настоящий» обмен  сообщениями, то есть пересылка от одного объекта другому специального объекта­ сообщения. Такая модель является чрезвычайно общей. Она прекрасно подходит, например,  для описания параллельных вычислений с помощью активных объектов, каждый из  которых имеет собственный поток исполнения и работает одновременно с прочими. Такие  объекты могут вести себя как отдельные, абсолютно автономные вычислительные единицы.  Посылка сообщений естественным образом решает вопрос обработки сообщений объектами, присвоенными полиморфным переменным — независимо от того, как объявляется  переменная, сообщение обрабатывает код класса, к которому относится присвоенный переменной объект. Данный подход реализован в языках  программированияSmalltalk, Ruby, Objective­C, Python. Однако общность механизма обмена сообщениями имеет и другую сторону —  «полноценная» передача сообщений требует дополнительных накладных расходов, что не  всегда приемлемо. Поэтому во многих современных объектно­ориентированных языках  программирования используется концепция «отправка сообщения как вызов метода» —  объекты имеют доступные извне методы, вызовами которых и обеспечивается  взаимодействие объектов. Данный подход реализован в огромном количестве языков  программирования, в том числе C++, Object Pascal, Java, Oberon­2. Однако, это приводит к  тому, что сообщения уже не являются самостоятельными объектами, и, как следствие, не  имеют атрибутов, что сужает возможности программирования. Некоторые языки  используют гибридное представление, демонстрируя преимущества одновременно обоих  подходов — например, CLOS, Python. Концепция виртуальных методов, поддерживаемая этими и другими современными  языками, появилась как средство обеспечить выполнение нужных методов при  использовании полиморфных переменных, то есть, по сути, как попытка расширить  возможности вызова методов для реализации части функциональности, обеспечиваемой  механизмом обработки сообщений. Особенности реализации[править | править вики­текст] Как уже говорилось выше, в современных объектно­ориентированных языках  программирования каждый объект является значением, относящимся к  определённомуклассу. Класс представляет собой объявленный программистом  составной тип данных, имеющий в составе: Поля данных Параметры объекта (конечно, не все, а только необходимые в программе), задающие его  состояние (свойства объекта предметной области). Иногда поля данных объекта называют  свойствами объекта, из­за чего возможна путаница. Физически поля представляют собой  значения (переменные, константы), объявленные как принадлежащие классу. Методы  Процедуры и функции, связанные с классом. Они определяют действия, которые можно  выполнять над объектом такого типа, и которые сам объект может выполнять. Классы могут наследоваться друг от друга. Класс­потомок получает все поля и методы  класса­родителя, но может дополнять их собственными либо переопределять уже  имеющиеся. Большинство языков программирования поддерживает только единичное  наследование (класс может иметь только один класс­родитель), лишь в некоторых  допускается множественное наследование — порождение класса от двух или более классов­ родителей. Множественное наследование создаёт целый ряд проблем, как логических, так и  чисто реализационных, поэтому в полном объёме его поддержка не распространена. Вместо  этого в 1990­е годы появилось и стало активно вводиться в объектно­ориентированные  языки понятие интерфейса. Интерфейс — это класс без полей и без реализации,  включающий только заголовки методов. Если некий класс наследует (или, как говорят,  реализует) интерфейс, он должен реализовать все входящие в него методы. Использование  интерфейсов предоставляет относительно дешёвую альтернативу множественному  наследованию. Взаимодействие объектов в абсолютном большинстве случаев обеспечивается вызовом ими  методов друг друга. Инкапсуляция обеспечивается следующими средствами Контроль доступа  Поскольку методы класса могут быть как чисто внутренними, обеспечивающими логику  функционирования объекта, так и внешними, с помощью которых взаимодействуют  объекты, необходимо обеспечить скрытость первых при доступности извне вторых. Для  этого в языки вводятся специальные синтаксические конструкции, явно задающие область  видимости каждого члена класса. Традиционно это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные только из  классов­потомков, и скрытые, доступные только внутри класса. Конкретная номенклатура  модификаторов и их точный смысл различаются в разных языках. Методы доступа  Поля класса в общем случае не должны быть доступны извне, поскольку такой доступ  позволил бы произвольным образом менять внутреннее состояние объектов. Поэтому поля  обычно объявляются скрытыми (либо язык в принципе не позволяет обращаться к полям  класса извне), а для доступа к находящимся в полях данным используются специальные  методы, называемые методами доступа. Такие методы либо возвращают значение того или  иного поля, либо производят запись в это поле нового значения. При записи метод доступа  может проконтролировать допустимость записываемого значения и, при необходимости,  произвести другие манипуляции с данными объекта, чтобы они остались корректными (внутренне согласованными). Методы доступа называют ещё аксессорами (от англ. access —  доступ), а по отдельности — геттерами (англ. get — чтение) и сеттерами (англ. set — запись) [6]. Свойства объекта  Псевдополя, доступные для чтения и/или записи. Свойства внешне выглядят как поля и  используются аналогично доступным полям (с некоторыми исключениями), однако  фактически при обращении к ним происходит вызов методов доступа. Таким образом,  свойства можно рассматривать как «умные» поля данных, сопровождающие доступ к  внутренним данным объекта какими­либо дополнительными действиями (например, когда  изменение координаты объекта сопровождается его перерисовкой на новом месте).  Свойства, по сути, не более чем синтаксический сахар, поскольку никаких новых  возможностей они не добавляют, а лишь скрывают вызов методов доступа. Конкретная  языковая реализация свойств может быть разной. Например, в C# объявление свойства  непосредственно содержит код методов доступа, который вызывается только при работе со  свойствами, то есть не требует отдельных методов доступа, доступных для  непосредственного вызова. В Delphi объявление свойства содержит лишь имена методов  доступа, которые должны вызываться при обращении к полю. Сами методы доступа  представляют собой обычные методы с некоторыми дополнительными требованиями к  сигнатуре. Полиморфизм реализуется путём введения в язык правил, согласно которым переменной  типа «класс» может быть присвоен объект любого класса­потомка её класса. Подходы к проектированию программ в целом[править | править вики­текст] ООП ориентировано на разработку крупных программных комплексов, разрабатываемых  командой программистов (возможно, достаточно большой). Проектирование системы в  целом, создание отдельных компонентов и их объединение в конечный продукт при этом  часто выполняется разными людьми, и нет ни одного специалиста, который знал бы о  проекте всё. Объектно­ориентированное проектирование состоит в описании структуры и поведения  проектируемой системы, то есть, фактически, в ответе на два основных вопроса:  Из каких частей состоит система.  В чём состоит ответственность каждой из частей. Выделение частей производится таким образом, чтобы каждая имела минимальный по  объёму и точно определённый набор выполняемых функций (обязанностей), и при этом  взаимодействовала с другими частями как можно меньше. Дальнейшее уточнение приводит к выделению более мелких фрагментов описания. По мере  детализации описания и определения ответственности выявляются данные, которые  необходимо хранить, наличие близких по поведению агентов, которые становятся  кандидатами на реализацию в виде классов с общими предками. После выделения  компонентов и определения интерфейсов между ними реализация каждого компонента  может проводиться практически независимо от остальных (разумеется, при соблюдении  соответствующей технологической дисциплины). Большое значение имеет правильное построение иерархии классов. Одна из известных  проблем больших систем, построенных по ООП­технологии — так называемаяпроблема  хрупкости базового класса. Она состоит в том, что на поздних этапах разработки, когда  иерархия классов построена и на её основе разработано большое количество кода,  оказывается трудно или даже невозможно внести какие­либо изменения в код базовых  классов иерархии (от которых порождены все или многие работающие в системе классы).  Даже если вносимые изменения не затронут интерфейс базового класса, изменение его  поведения может непредсказуемым образом отразиться на классах­потомках. В случае  крупной системы разработчик базового класса просто не в состоянии предугадать  последствия изменений, он даже не знает о том, как именно базовый класс используется и от каких особенностей его поведения зависит корректность работы классов­потомков. Родственные методологии[править | править вики­текст] Компонентное программирование — следующий этап развития ООП; прототип­ и класс­ ориентированное программирование — разные подходы к созданию программы, которые  могут комбинироваться, имеющие свои преимущества и недостатки. Компонентное программирование[править | править вики­текст] Основная статья: Компонентно­ориентированное программирование Компонентно­ориентированное программирование — это своеобразная «надстройка» над  ООП, набор правил и ограничений, направленных на построение крупных развивающихся  программных систем с большим временем жизни. Программная система в этой методологии  представляет собой набор компонентов с хорошо определёнными интерфейсами. Изменения в существующую систему вносятся путём создания новых компонентов в дополнение или в  качестве замены ранее существующих. При создании новых компонентов на основе ранее созданных запрещено использование наследования реализации — новый компонент может  наследовать лишь интерфейсы базового. Таким образом компонентное программирование  обходит проблему хрупкости базового класса. Прототипное программирование[править | править вики­текст] Прототипное программирование, сохранив часть черт ООП, отказалось от базовых  понятий — класса и наследования.  Вместо механизма описания классов и порождения экземпляров язык предоставляет  механизм создания объекта (путём задания набора полей и методов, которые объект  должен иметь) и механизм клонирования объектов.  Каждый вновь созданный объект является «экземпляром без класса». Каждый объект  может стать прототипом — быть использован для создания нового объекта с  помощью операции клонирования. После клонирования новый объект может быть  изменён, в частности, дополнен новыми полями и методами.  Клонированный объект либо становится полной копией прототипа, хранящей все  значения его полей и дублирующей его методы, либо сохраняет ссылку на прототип,  не включая в себя клонированных полей и методов до тех пор, пока они не будут  изменены. В последнем случае среда исполнения обеспечивает  механизм делегирования — если при обращении к объекту он сам не содержит  нужного метода или поля данных, вызов передаётся прототипу, от него, при  необходимости — дальше по цепочке. Класс­ориентированное программирование[править | править вики­текст] Основная статья: Класс­ориентированное программирование в разделе не хватает ссылок  на источники информации. Информация должна  быть проверяема, иначе она  может быть поставлена под  сомнение и удалена. Вы  можете отредактировать эту  статью, добавив ссылки  на авторитетные источники. Эта отметка установлена 31  декабря 2012. Класс­ориентированное программирование — это программирование, сфокусированное на  данных, причем данные и поведение неразрывно связаны между собой. Вместе данные и  поведение представляют собой класс. Соответственно в языках, основанных на понятии  «класс», все объекты разделены на два основных типа — классы и экземпляры. Класс  определяет структуру и функциональность (поведение), одинаковую для всех экземпляров  данного класса. Экземпляр является носителем данных — то есть обладает состоянием,  меняющимся в соответствии с поведением, заданным классом. В класс­ориентированных  языках новый экземпляр создаётся через вызов конструктора класса (возможно, с набором  параметров). Получившийся экземпляр имеет структуру и поведение, жёстко заданные его  классом. Производительность объектных программ[править | править вики­текст] Гради Буч указывает[7] на следующие причины, приводящие к снижению производительности программ из­за использования объектно­ориентированных средств: Динамическое связывание методов.  Обеспечение полиморфного поведения объектов приводит к необходимости связывать  методы, вызываемые программой (то есть определять, какой конкретно метод будет  вызываться) не на этапе компиляции, а в процессе исполнения программы, на что тратится  дополнительное время. При этом реально динамическое связывание требуется не более чем  для 20 % вызовов, но некоторые ООП­языки используют его постоянно. Значительная глубина абстракции.  ООП­разработка часто приводит к созданию «многослойных» приложений, где выполнение  объектом требуемого действия сводится к множеству обращений к объектам более низкого  уровня. В таком приложении происходит очень много вызовов методов и возвратов из  методов, что, естественно, сказывается на производительности. Наследование «размывает» код.  Код, относящийся к «конечным» классам иерархии наследования, которые обычно и  используются программой непосредственно, находится не только в самих этих классах, но и в их классах­предках. Относящиеся к одному классу методы фактически описываются в  разных классах. Это приводит к двум неприятным моментам:  Снижается скорость трансляции, так как компоновщику приходится подгружать  описания всех классов иерархии.  Снижается производительность программы в системе со страничной памятью —  поскольку методы одного класса физически находятся в разных местах кода, далеко  друг от друга, при работе фрагментов программы, активно обращающихся к  унаследованным методам, система вынуждена производить частые переключения  страниц. Инкапсуляция снижает скорость доступа к данным.  Запрет на прямой доступ к полям класса извне приводит к необходимости создания и  использования методов доступа. И написание, и компиляция, и исполнение методов доступа сопряжены с дополнительными расходами. Динамическое создание и уничтожение объектов.  Динамически создаваемые объекты, как правило, размещаются в куче, что менее  эффективно, чем размещение их на стеке и, тем более, статическое выделение памяти под  них на этапе компиляции. Несмотря на отмеченные недостатки, Буч утверждает, что выгоды от использования ООП  более весомы. Кроме того, повышение производительности за счёт лучшей организации  ООП­кода, по его словам, в некоторых случаях компенсирует дополнительные накладные  расходы на организацию функционирования программы. Можно также заметить, что многие  эффекты снижения производительности могут сглаживаться или даже полностью  устраняться за счёт качественной оптимизации кода компилятором. Например, упомянутое  выше снижение скорости доступа к полям класса из­за использования методов доступа  устраняется, если компилятор вместо вызова метода доступа использует инлайн­ подстановку (современные компиляторы делают это вполне уверенно). Критика ООП[править | править вики­текст] В этой статье или разделе  имеется  избыток  цитат либо  слишком  длинные цитаты. Излишние и  чрезмерно  большие  цитаты следу ет обобщить и переписать  своими  словами. Возможно,  эти цитаты  будут более  уместны  в Викицитатн ике или  в Викитеке. Несмотря на отдельные критические замечания в адрес ООП, в настоящее время именно эта  парадигма используется в подавляющем большинстве промышленных проектов. Однако,  нельзя считать, что ООП является наилучшей из методик программирования во всех  случаях. Критические высказывания в адрес ООП:  Было показано отсутствие значимой разницы в продуктивности разработки  программного обеспечения между ООП и процедурным подходом[8].  Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий во  многом из­за отсутствия строгого и общепризнанного определения ООП[9].  Александр Степанов в одном из своих интервью указывал, что ООП  «методологически неправильно» и что «…ООП практически такая же мистификация,  как и искусственный интеллект…»[10].  Фредерик Брукс указывает, что наиболее сложной частью создания программного  обеспечения является «…спецификация, дизайн и тестирование концептуальных  конструкций, а отнюдь не работа по выражению этих концептуальных  конструкций…». ООП (наряду с такими технологиями как искусственный  интеллект,верификация программ, автоматическое программирование, графическое программирование, экспертные системы и др.), по его мнению, не является  «серебряной пулей», которая могла бы на порядок величины снизить сложность  разработки программных систем. Согласно Бруксу, «…ООП позволяет сократить  только привнесённую сложность в выражение дизайна. Дизайн остаётся сложным по  своей природе…»[11].  Эдсгер Дейкстра указывал: «…то, о чём общество в большинстве случаев просит —  это змеиное масло. Естественно, „змеиное масло“ имеет очень впечатляющие  названия, иначе будет очень трудно что­то продать: „Структурный анализ и Дизайн“,  „Программная инженерия“, „Модели зрелости“, „Управляющие информационные  системы“ (Management Information Systems), „Интегрированные среды поддержки  проектов“, „Объектная ориентированность“, „Реинжиниринг бизнес­процессов“…»[12].  Никлаус Вирт считает, что ООП — не более чем тривиальная надстройка над  структурным программированием, и преувеличение её значимости, выражающееся, в  том числе, во включении в языки программирования всё новых модных «объектно­ ориентированных» средств, вредит качеству разрабатываемого программного  обеспечения.  Патрик Киллелиа в своей книге «Тюнинг веб­сервера» писал: «…ООП предоставляет  вам множество способов замедлить работу ваших программ…».  Известная обзорная статья проблем современного ООП­программирования  перечисляет некоторые типичные проблемы ООП[13][неавторитетный источник? 324 дня].  В программистском фольклоре получила широкое распространение критика  объектно­ориентированного подхода в сравнении с функциональным подходом с  использованием метафоры «Королевства Существительных» из эссе Стива Йегги[14]. Если попытаться классифицировать критические высказывания в адрес ООП, можно  выделить несколько аспектов критики данного подхода к программированию. Критика рекламы ООП.  Критикуется явно высказываемое или подразумеваемое в работах некоторых  пропагандистов ООП, а также в рекламных материалах «объектно­ориентированных»  средств разработки представление об объектном программировании как о некоем  всемогущем подходе, который магическим образом устраняет сложность  программирования. Как замечали многие, в том числе упомянутые выше Брукс и Дейкстра,  «серебряной пули не существует» — независимо от того, какой парадигмы  программирования придерживается разработчик, создание нетривиальной сложной программной системы всегда сопряжено со значительными затратами интеллектуальных  ресурсов и времени. Из наиболее квалифицированных специалистов в области ООП никто,  как правило, не отрицает справедливость критики этого типа. Оспаривание эффективности разработки методами ООП.  Критики оспаривают тезис о том, что разработка объектно­ориентированных программ  требует меньше ресурсов или приводит к созданию более качественного ПО. Проводится  сравнение затрат на разработку разными методами, на основании которого делается вывод  об отсутствии у ООП преимуществ в данном направлении. Учитывая крайнюю сложность  объективного сравнения различных разработок, подобные сопоставления, как минимум,  спорны. С другой стороны получается что ровно так же спорны и утверждения об  эффективности ООП. Производительность объектно­ориентированных программ.  Указывается на то, что целый ряд «врождённых особенностей» ООП­технологии делает  построенные на её основе программы технически менее эффективными, по сравнению с  аналогичными необъектными программами. Не отрицая действительно имеющихся  дополнительных накладных расходов на организацию работы ООП­программ (см. раздел  «Производительность» выше), нужно, однако, отметить, что значение снижения  производительности часто преувеличивается критиками. В современных условиях, когда  технические возможности компьютеров чрезвычайно велики и постоянно растут, для  большинства прикладных программ техническая эффективность оказывается менее  существенна, чем функциональность, скорость разработки и сопровождаемость. Лишь для  некоторого, очень ограниченного класса программ (ПО встроенных систем, драйверы  устройств, низкоуровневая часть системного ПО, научное ПО) производительность остаётся критическим фактором. Критика отдельных технологических решений в ООП­языках и библиотеках.  Эта критика многочисленна, но затрагивает она не ООП как таковое, а приемлемость и  применимость в конкретных случаях тех или иных реализаций её механизмов. Одним из  излюбленных объектов критики является язык C++, входящий в число наиболее  распространённых промышленных ООП­языков. Объектно­ориентированные языки[править | править вики­текст] Основная статья: Объектно­ориентированный язык программирования Многие современные языки специально созданы для облегчения объектно­ориентированного программирования. Однако следует отметить, что можно применять техники ООП и для не­ объектно­ориентированного языка и наоборот, применение объектно­ориентированного  языка вовсе не означает, что код автоматически становится объектно­ориентированным. Как правило, объектно­ориентированный язык (ООЯ) содержит следующий набор  элементов:  Объявление классов с полями (данными — членами класса) и методами  (функциями — членами класса).  Механизм расширения класса (наследования) — порождение нового класса от  существующего с автоматическим включением всех особенностей реализации класса­ предка в состав класса­потомка. Большинство ООЯ поддерживают только единичное  наследование.  Полиморфные переменные и параметры функций (методов), позволяющие  присваивать одной и той же переменной экземпляры различных классов.  Полиморфное поведение экземпляров классов за счёт использования виртуальных  методов. В некоторых ООЯ все методы классов являются виртуальными. Некоторые языки добавляют к указанному минимальному набору те или иные  дополнительные средства. В их числе:  Конструкторы, деструкторы, финализаторы.  Свойства (аксессоры).  Индексаторы.  Средства управления видимостью компонентов классов (интерфейсы или  модификаторы доступа, такие как public, private, protected, feature и др.) Одни языки отвечают принципам ООП в полной мере — в них все основные элементы  являются объектами, имеющими состояние и связанные методы. Примеры подобных  языков — Smalltalk, Eiffel. Существуют гибридные языки, совмещающие объектную  подсистему в целостном виде с подсистемами других парадигм как «два и более языка в  одном», позволяющие совмещать в одной программе объектные модели с иными, и  размывающие грань между объектно­ориентированной и другими парадигмами за счёт  нестандартных возможностей, балансирующих между ООП и другими парадигмами (таких  как множественная диспетчеризация, параметрические классы, возможность манипулировать методами классов как самостоятельными объектами, и др.). Примеры таких языков: CLOS, Dylan, OCaml, Python, Ruby, Objective­C. Однако, наиболее распространены  языки, включающие средства эмуляции объектной модели поверх более традиционной  императивной семантики. Алан Кэйназвал такие языки «склеиванием возможностей»  (англ. agglutination of features) в противовес «чистоте стиля» (англ. crystalization of style)  языков, воплощающих некую парадигму непосредственно[15]. Примеры таких  языков — Симула, C++, Visual Basic, Delphi, Модула, Модула­2, Java, C#, PHP. Объектно­ориентированное программирование Объект и инкапсуляция Объектно­ориентированное программирование (ООП) ­ это результат естественной  эволюции более ранних методологий программирования. Потребность в ООП связана со  стремительным усложнением приложений и отсюда как следствие недостаточной  надежностью программ и выразительными способностями языков программирования. ООП ­ это моделирование объектов посредством иерархически связанных классов.  Малозначащие детали объекта скрыты от нас, и если мы даем команду, например,  переместить объект, то он "знает", как он это делает. Переход от традиционного  программирования к ООП на начальном этапе характерен тем, что под объектами в  программе подразумеваются конкретные физические объекты. В этом случае легче дается  понимание различных действий над ними. В качестве примера можно выбрать простые  графические фигуры, поскольку каждая фигура представляет реальный объект на экране.  Его всегда можно отобразить и тем самым проверить моделируемые действия над объектом  в явном виде. После того как определены простейшие графические объекты, достаточно  легко можно формировать более сложные на основе уже имеющихся. В ООП такому  сложному графическому объекту соответствует список примитивных объектов, к которому  применимы все те же действия, что и к составляющим его элементам: отображение,  стирание с экрана, перемещение в заданном направлении. ООП опирается на три основных понятия: инкапсуляция; наследование; полиморфизм. В Паскале объект очень похож на запись, которая является упаковкой для соединения  нескольких взаимосвязанных элементов данных вместе, под одним именем. Данные  определяют свойства объекта. С другой стороны, объект имеет свое поведение,  определяемое процедурами и функциями этого объекта. Инкапсуляция ­ объединение данных с процедурами и функциями для создания нового  типа данных ­ объекта. Связанные с объектом процедуры и функции  называются методами. Для описания объектов используется зарезервированное слово Object. Описание объекта  помещается в разделе описания типов. Вначале описываются все инкапсулированные в  объекте данные, а затем ­ методы доступа к этим данным. Сами методы при описании  объекта не раскрываются, указываются лишь заголовки. Методы описываются ниже по  тексту программы. В рассмотренном ниже примере тип объекта "координаты точки" может быть определен  следующим образом: Type  Location = Object     X,Y : Integer; {Данные}     Procedure Init(InitX, InitY : Integer); {Заголовки}     Function GetX : Integer; {методов}     Function GetY : Integer;  End;  {Описание методов}  Procedure Location.Init(InitX, InitY : Integer);  Begin     X:=InitX;     Y:=InitY;  End;  Function Location.GetX : Integer;  Begin    GetX:=X;  End;  Function GetY : Integer;  Begin    GetY:=Y;  End; Методы объекта выбираются из соображений назначения этого объекта. Так, если мы имеем  дело с точкой, желательно иметь возможность задавать ее координаты (метод Init) и в любой момент получать значения координат этой точки (использованием  методов GetX,GetY). Экземпляры типа "объект" объявляются точно так же, как любая переменная (статическая либо указатель на переменную, размещенную в динамической памяти): Var MyLocation : Location;     Ploc : ^Location; Теперь, чтобы получить конкретный экземпляр объекта "координаты точки", надо его  инициализировать вызовом соответствующего метода: MyLocation.Init(100,200); Теперь поля X и Y получили свои значения 100 и 200. Доступ к полям (данным и методам) объекта можно получить так же, как в обычной записи  типа Record: либо используя точку в имени, либо оператором присоединеня With: With MyLocation Do Init(100,200); Можно получить и прямой доступ к данным объекта: MyLocation.X:=100; MyLocation.Y:=200; Однако хороший стиль программирования требует избегать прямого доступа к полям  данных. Всюду, где надо получить значение одного из данных объекта, вы вызываете метод,  принадлежащий этому объекту, который возвращает значение требуемого поля. Чтобы  установить значение поля, вы вызываете метод, присваивающий новое значение этому полю. Объектно­ориентированное программирование Основные понятия объектно­ориентированного программирования (ООП).  Основополагающей идеей одного из современных подходов к программированию —  объектно­ориентированному — является объединение данных и обрабатывающих их  процедур в единое целое — объекты. Объектно­ориентированное программирование — это методология программирования,  которая основана на представлении программы в виде совокупности объектов, каждый из  которых является реализацией определенного класса (типа особого вида), а классы  образуют иерархию, основанную на принципах наследуемости. При этом объект характеризуется как совокупностью всех своих свойств и их текущих значений, так и  совокупностью допустимых для данного объекта действий. Несмотря на то что в различных источниках делается акцент на те или иные особенности  внедрения и применения ООП, три основных (базовых) понятия ООП остаются  неизменными. К ним относятся: • наследование (Inheritance); • инкапсуляция (Encapsulation); • полиморфизм (Polymorphism). Эти понятия как три кита лежат в основе ООП. При  процедурном подходе требуется описать каждый шаг, каждое действие алгоритма для  достижения конечного результата. В отличие от него объектно­ориентированный подход  оставляет за объектом право решать, как отреагировать и что сделать в ответ на  поступивший вызов. Достаточно в стандартной форме поставить перед ним задачу и  получить ответ. Объект состоит из следующих трех частей: • имени объекта; • состояния (переменных состояния); • методов (операций). Можно дать обобщающее определение: объект ООП— это совокупность переменных  состояния и связанных с ними методов  (операций). Упомянутые методы определяют, как  объект взаимодействует с окружающим миром. Под методами объекта понимают процедуры и функции, объявление которых включено в  описание объекта и которые выполняют действия. Возможность управлять состояниями  объекта посредством вызова методов в итоге и определяет поведение объекта.  Совокупность методов часто называют интерфейсом объекта. Инкапсуляция — это механизм, который объединяет данные и методы, манипулирующие  этими данными, и защищает и то и другое от внешнего вмешательства или неправильного  использования. Когда методы и данные объединяются таким способом, создается объект. Применяя инкапсуляцию, мы защищаем данные, принадлежащие объекту, от возможных  ошибок, которые могут возникнуть при прямом доступе к этим данным. Кроме того,  применение указанного принципа очень часто помогает локализовать возможные ошибки в  коде программы. А это намного упрощает процесс поиска и исправления этих ошибок.  Можно сказать, что инкапсуляция обеспечивает сокрытие данных, что позволяет защитить  эти данные. Однако применение инкапсуляции ведет к снижению эффективности доступа к элементам объекта. Это обусловлено необходимостью вызова методов для изменения  внутренних элементов (переменных) объекта. Но при современном уровне развития  вычислительной техники подобные потери в эффективности не играют существенной роли. Наследование — это процесс, посредством которого один объект может наследовать  свойства другого объекта и добавлять к ним черты, характерные только для него. В итоге  создается иерархия объектных типов, где поля данных и методов «предков» автоматически  являются и полями данных и методов «потомков». Смысл и универсальность наследования заключаются в том, что не надо каждый раз заново  («с нуля») описывать новый объект, а можно указать «родителя» (базовый класс) и описать  отличительные особенности нового класса. В результате новый объект будет обладать всеми свойствами родительского класса плюс своими собственными отличительными  особенностями. Пример 1. Можно создать базовый класс «транспортное средство», который универсален  для всех средств передвижения, к примеру, на четырех колесах. Этот класс «знает», как  двигаются колеса, как они поворачиваются, тормозят и т.д. Затем на основе этого класса  создадим класс «легковой автомобиль». Поскольку новый класс унаследован из класса  «транспортное средство», унаследованы все особенности этого класса, и нам не надо в  очередной раз описывать, как двигаются колеса и т. д. Мы просто добавим те черты,  которые характерны для легковых автомобилей. В то же время мы можем взять за основу  этот же класс «транспортное средство» и построить класс «грузовые автомобили». Описав  отличительные особенности грузовых автомобилей, получим новый класс «грузовые  автомобили». А, к примеру, на основании класса «грузовой автомобиль» уже можно описать определенный подкласс грузовиков и т.д. Таким образом, сначала формируем простой  шаблон, а затем, усложняя и конкретизируя, поэтапно создаем все более сложные шаблоны. Полиморфизм — это свойство, которое позволяет одно и то же имя использовать для  решения нескольких технически разных задач. Полиморфизм подразумевает такое  определение методов в иерархии типов, при котором метод с одним именем может  применяться к различным родственным объектам. В общем смысле концепцией  полиморфизма является идея «один интерфейс — множество методов». Преимуществом  полиморфизма является то, что он помогает снижать сложность программ, разрешая  использование одного интерфейса для единого класса действий. Выбор конкретного  действия в зависимости от ситуации возлагается на компилятор. Пример 2. Пусть есть класс «автомобиль», в котором описано, как должен передвигаться  автомобиль, как он поворачивает, как подает сигнал и т.д. Там же описан метод  «переключение передачи». Допустим, что в этом методе класса «автомобиль» описана автоматическая коробка передач. А теперь необходимо описать класс «спортивный  автомобиль», у которого механическое (ручное) переключение скоростей. Конечно, можно  было бы описать заново все методы для класса «спортивный автомобиль». Вместо этого  указываем, что класс «спортивный автомобиль» унаследован из класса «автомобиль», а  следовательно, он обладает всеми свойствами и методами, описанными для класса­ родителя. Единственное, что надо сделать — это переписать метод «переключение передач» для механической коробки передач. В результате при вызове метода «переключение  передач» будет выполняться метод не родительского класса, а самого класса «спортивный  автомобиль». Механизм работы ООП в таких случаях можно описать примерно так: при вызове того или  иного метода класса сначала ищется метод в самом классе. Если метод найден, то он  выполняется, и поиск этого метода завершается. Если же метод не найден, то обращаемся к  родительскому классу и ищем вызванный метод в нем. Если он найден, то поступаем, как  при нахождении метода в самом классе. А если нет, то продолжаем дальнейший поиск вверх по иерархическому дереву, вплоть до корня (верхнего класса) иерархии. Этот пример  отражает так называемый механизм раннего связывания. Объекты в Турбо Паскале. Инкапсуляция. Для описания объектов зарезервировано слово  object. Тип object — это структура данных, которая содержит поля и методы. Описание  объектного типа выглядит следующим образом: Type <Идентификатор типа oбъeктa>=Object <поле>; . . . <поле>; <метод>; . . . <метод>; End; Поле содержит имя и тип данных. Методы — это процедуры или функции, объявленные  внутри декларации объектного типа, в том числе и особые процедуры, создающие и  уничтожающие объекты (конструкторы и деструкторы). Объявление метода внутри  описания объектного типа состоит только из заголовка (как в разделе Interface в модуле). Пример 3. Опишем объект «обыкновенная дробь» с методами «НОД числителя и  знаменателя», «сокращение», «натуральная степень». Type Natur=l..32767; Frac=Record P: Integer; Q: Natur End; Drob=Object A: Frac; Procedure NOD (Var C: Natur); Procedure Sokr; Procedure Stepen(N: Natur; Var C: Frac); End; Описание объектного типа, собственно, и выражает такое свойство, как инкапсуляция. Проиллюстрируем далее работу с описанным объектом, реализацию его методов и  обращение к указанным методам. При этом понадобятся некоторые вспомогательные  методы. Type Natur=l..Maxint; Frac=Record P: Integer; Q: Natur End; {Описание объектного типа} Drob=Object A: Frac; Procedure Vvod; {ввод дроби} Procedure NOD(Var C: Natur); {НОД} Procedure Sokr; Procedure Stepen(N: Natur; Var C: Frac); Procedure Print; {вывод дроби} End; (Описания методов объекта) Procedure Drob.NOD; Var M,N: Natur; Begin M:=Abs(A.P); N:=A.Q; While M<>N Do If M>N Then If M Mod N<>0 Then M:=M Mod N Else M:»=N Else If N Mod M<>0 Then N:=N Mod M Else N:=M; C:=M End; Procedure Drob.Sokr; Var N: Natur; Begin If A.P<>O Then Begin Drob.NOD(N); A.P:=A.P Div N; A.Q:=A.Q Div N End Else A.Q:=1 End; Procedure Drob.Stepen; Var I: Natur; Begin C.P:=1; C.Q:=1; For I:=1 To N Do   Begin C.P:=C.P*A.P; C.Q:=C.Q*A.Q End; End; Procedure Drob.Vvod; Begin Write('Введите числитель дроби:'); ReadLn(A.P) ; Write('Введите знаменатель дроби:');ReadLn(A.Q) ; End; Procedure Drob.Print; Begin WriteLn(A.P,'/',A.Q) End; {Основная программа} Var Z: Drob; F: Frac; Begin Z.Vvod; {ввод дроби} Z.Print; {печать введенной дроби} Z.Sokr; {сокращение введенной дроби) Z.Print; (печать дроби после сокращения} Z.Stepen(4,F); (возведение введенной дроби в 4­ю степень} WriteLn(F.P,'/'/F.Q) End. Прокомментируем отдельные моменты в рассмотренном примере. Во­первых,  реализация методов осуществляется в разделе описаний, после объявления объекта, причем при реализации метода достаточно указать его заголовок без списка параметров, но с указанием объектного типа, методом которого он является. Еще раз отметим, что все это напоминает создание модуля, где те ресурсы, которые доступны при его подключении, прежде всего объявляются в разделе Interface, а затем реализуются в разделе Implementation. В действительности объекты и их методы реализуют чаще всего именно в виде модулей. Во­вторых, все действия над объектом выполняются только с помощью его методов. В­третьих, для работы с отдельным экземпляром объектного типа в разделе описания  переменных должна быть объявлена переменная (или переменные) соответствующего типа.  Легко видеть, что объявление статических объектов не отличается от объявления других  переменных, а их использование в программе напоминает использование записей. Наследование. Объектные типы можно выстроить в иерархию. Один объектный тип может  наследовать компоненты из другого объектного типа. Наследующий объект называется  потомком. Объект, которому наследуют, — предком. Если предок сам является чьим­либо  наследником, то потомок наследует и эти поля и методы. Следует подчеркнуть, что  наследование относится только к типам, но не экземплярам объекта. Описание типа­потомка имеет отличительную особенность: <имя типa­потомкa>=Object(<имя типа­предка>), дальнейшая запись описания обычная. Следует помнить, что поля наследуются без какого­либо исключения. Поэтому, объявляя  новые поля, необходимо следить за уникальностью их имен, иначе совпадение имени нового  поля с именем наследуемого поля вызовет ошибку. На методы это правило не  распространяется, но об этом ниже. Пример 4. Опишем объектный тип «Вычислитель» с методами «сложение», «вычитание»,  «умножение», «деление» (некоторый исполнитель) и производный от него тип  «Продвинутый вычислитель» с новыми методами «степень», «корень n­й степени». Type BaseType=Double; Vichislitel=0bject А,В,С: BaseType; Procedure Init; {ввод или инициализация полей} Procedure Slozh; Procedure Vich; Procedure Umn; Procedure Delen End; NovijVichislitel=Object(Vichislitel) N: Integers; Procedure Stepen; Procedure Koren End; Обобщая вышесказанное, перечислим правила наследования: • информационные поля и методы родительского типа наследуются всеми его типами­ потомками независимо от числа промежуточных уровней иерархии; • доступ к полям и методам родительских типов в рамках описания любых типов­потомков  выполняется так, как будто бы они описаны в самом типе­потомке; • ни в одном из типов­потомков не могут использоваться идентификаторы полей,  совпадающие с идентификаторами полей какого­либо из родительских типов. Это правило  относится и к идентификаторам формальных параметров, указанных в заголовках методов; • тип­потомок может доопределить произвольное число собственных методов и  информационных полей; • любое изменение текста в родительском методе автоматически оказывает влияние на все  методы порожденных типов­потомков, которые его вызывают; • в противоположность информационным полям идентификаторы методов в типах­потомках могут совпадать с именами методов в родительских типах. При этом одноименный метод в  типе­потомке подавляет одноименный ему родительский, и в рамках типа­потомка при  указании имени такого метода будет вызываться именно метод типа­потомка, а не  родительский. Вызов наследуемых методов осуществляется согласно следующим принципам: • при вызове метода компилятор сначала ищет метод, имя которого определено внутри типа  объекта; • если в типе объекта не определен метод с указанным в операторе вызова именем, то  компилятор в поисках метода с таким именем поднимается выше к непосредственному  родительскому типу; • если наследуемый метод найден и его адрес подставлен, то следует помнить, что  вызываемый метод будет работать так, как он определен и компилирован для родительского типа, а не для типа­потомка. Если этот наследуемый родительский тип вызывает еще и другие методы, то вызываться будут только родительские или вышележащие методы, так  как вызовы методов из нижележащих по иерархии типов не допускаются. Полиморфизм. Как отмечалось выше, полиморфизм (многообразие) предполагает  определение класса или нескольких классов методов для родственных объектных типов так, что каждому классу отводится своя функциональная роль. Методы одного класса обычно  наделяются общим именем. Пример 5. Пусть имеется родительский объектный тип «выпуклый четырехугольник» (поля  типа «координаты вершин, заданные в порядке их обхода») и типы, им порожденные:  параллелограмм, ромб, квадрат Описать для указанных фигур методы «вычисление углов» (в градусах), «вычисление  диагоналей», «вычисление длин сторон», «вычисление периметра», «вычисление площади». Type BaseType=Double; FourAngle=Object x1,y1,x2,y2,x3,y3,x4,y4, A,B,C,D,D1,D2, Alpha,Beta,Gamma,Delta, P,S: BaseType; Procedure Init; Procedure Storony; Procedure Diagonali; Procedure Angles; Procedure Perimetr; Procedure Ploshad; Procedure PrintElements; End; Parall=Object(FourAngie) Procedure Storony; Procedure Perimetr; Procedure Ploshad; End; Romb=0bject(Parall) Procedure Storony; Procedure Perimetr; End; Kvadrat=0bject(Romb) Procedure Angles; Procedure Ploshad; End; Procedure FourAngie.Init; Begin Write ('Введите координаты вершин заданного четырехугольника:'); ReadLn(x1, y1, х2, у2, х3, у3, х4, у4); End; Procedure FourAngie.Storony; Begin A:=Sqrt(Sqr(x2­xl)+Sqr(y2­yl)); B:=Sqrt(Sqr(x3­x2)+Sqr(y3­y2)); C:=Sqrt(Sqr(x4­x3)+Sqr(y4­y3)); D:=Sqrt(Sqr(x4­xl)+Sqr(y4­yl)); End; Procedure FourAngle.Diagonali; Begin Dl:=Sqrt(Sqr(xl­x3)+Sqr(yl­y3)); D2:=Sqrt(Sqr(x2­x4)+Sqr(y2­y4)); End; Procedure FourAngle.Angles; Function Ugol(Aa,Bb,Cc: BaseType): BaseType; Var VspCos, VspSin: BaseType; Begin VspCos:=(Sqr(Aa)+Sqr(Bb)­Sqr(Cc))/(2*Aa*Bb); VspSin:=Sqrt(1­Sqr(VspCos)); If Abs(VspCos)>le­7 Then Ugol:=(ArcTan(VspSin/VspCos) +Pi*Ord(VspCos<0))/Pi*180 Else Ugol:=90 End; Begin Alpha:=Ugol(D,A,D2);Beta:=Ugol(A,B,Dl);Gamina:=Ugol(B,C,D2); Delta: =Ugol (C,D,  Dl); End; Procedure FourAngle.Perimetr; Begin P:=A+B+C+D End; Procedure FourAngle.Ploshad; Var Peri, Per2: BaseType; Begin Perl:=(A+D+D2)/2; Per2:=(B+C+D1)/2; S:=Sqrt(Perl*(Perl­A)*(Perl­D)*(Perl­D2)) + Sqrt(Per2*(Per2­B)*(Per2­C)*(Per2­Dl)) End; Procedure FourAngle.PrintElements; Begin WriteLn('Стороны:',A:10:6,В:10:6,С:10:6,D:10:6,'Углы:',Alpha:10:4,Beta:10:4,Gamma:10:4,Del ta:10:4,'Периметр:',Р:10:6,'Площадь:',S:10:6,'Диагонали:', D1:10:6,D2:10:6) End; Procedure Parall.Storony; Begin A:=Sqrt(Sqr(x2­xl)+Sqr(y2­yl)); B:=Sqrt(Sqr(x3­x2)+Sqr(y3­y2)) ; C:=A; D:=B End; Procedure Parall.Perimetr; Begin P:=2*(A+B) End; Procedure Parall.Ploshad; Var Per: BaseType; Begin Per:=(A+D+D2)/2; S:=2*Sqrt(Per*(Per­A)*(Per­D)*(Per­D2)) End ; Procedure Romb.Storony; Begin A:=Sqrt(Sqr(x2­xl)+Sqr(y2­yl)); B:=A; C:=A; D:=A End; Procedure Romb.Perimetr ; Begin P:=2*A End; Procedure Kvadrat.Angles; Begin Alpha:=90; Beta:=90; Gamma:=90; Delta:=90; End; Procedure Kvadrat.Ploshad; Begin S:=Sqr(A) End; {Основная программа} Var obj: Kvadrat ; Begin obj.Init; obj.Storony; obj.Diagonali; obj.Angles; obj.Perimetr; obj.Ploshad; obj.PrintElements End. Таким образом, вычисление соответствующего элемента в фигуре, если это действие по  сравнению с другими является уникальным, производится обращением к своему методу.

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования

Основы объектно-ориентированного программирования
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
17.02.2017