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

ЗАДАНИЕ N 186 Тема: Объектно-ориентированное программирование Для объектно-ориентированной технологии программирования верно утверждение, что …

классы образуют иерархию на принципах наследования
в качестве основных элементов программы используются процедуры, реализующие некоторые алгоритмы
поведение объектов одного класса очень различается
внешнее описание класса (интерфейс) отражает структуру объекта
Решение: Объектно-ориентированное программирование (ООП) – это технология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию на принципах наследования. Объектно-ориентированное программирование использует в качестве элементов конструкции классы и объекты, а не алгоритмы. Идея классов является основой ООП и отражает строение объектов реального мира, поскольку каждый предмет или процесс обладает набором характеристик или отличительных черт, иными словами, свойствами и поведением. Класс – описание множества объектов, связанных общностью структуры и поведением. Существует явное разделение внешнего и внутреннего описания класса (интерфейса и реализации). Интерфейс отражает внешнее поведение объекта, описывая абстракцию поведения всех объектов данного класса, но скрывает структуру и несущественные детали. Реализация составляет его внутреннее проявление и определяет особенности поведения. Объект представляет собой особый опознаваемый предмет или сущность (реальную или абстрактную), имеющие четко определенное функциональное назначение в данной предметной области. Структура и поведение одинаковых объектов описываются в общем для них классе. В ООП конкретные величины типа данных «класс» называются экземплярами класса, или объектами. Объекты взаимодействуют между собой, посылая и получая сообщения. Сообщение – это запрос на выполнение действия, содержащий набор необходимых параметров. Механизм сообщений реализуется с помощью вызова соответствующих функций или методов классов. Основными принципами или свойствами ООП являются инкапсуляция, наследование и полиморфизм.

ЗАДАНИЕ N 187 Тема: Объектно-ориентированное программирование В объектно-ориентированном программировании определенный пользователем тип данных, который обладает внутренними данными и методами для работы с ними в форме процедур или функций, называется …


ЗАДАНИЕ N 188 Тема: Объектно-ориентированное программирование Одно из основополагающих понятий объектно-ориентированного программирования «полиморфизм» означает …

свойство различных объектов выполнять одно и то же действие разными способами
объединение в единое целое данных и алгоритмов обработки этих данных
способность объекта сохранять свойства и методы класса-родителя
сокрытие информации и комбинирование данных и методов внутри объекта

ЗАДАНИЕ N 189 Тема: Объектно-ориентированное программирование В объектно-ориентированном программировании уведомления, получаемые или передаваемые объектом другим объектам или приложениям, называются …

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

ЗАДАНИЕ N 190 Тема: Объектно-ориентированное программирование Объектом объектно-ориентированного программирования называется …

совокупность переменных состояния и связанных с ними методов (операций)
группа данных и методов (функций) для работы с этими данными
функция или процедура, выполняющие определенные действия
характеристика, назначенная элементу класса
Решение: Класс и объект – наиболее используемые термины объектно-ориентированного программирования (ООП). Объект ООП – это совокупность переменных состояния и связанных с ними методов (операций), которые определяют, как объект взаимодействует с окружающим миром. Объект состоит из следующих трех частей: имя объекта, состояние (переменные состояния), методы (операции).

ЗАДАНИЕ N 191 Тема: Объектно-ориентированное программирование Одно из основополагающих понятий объектно-ориентированного программирования «инкапсуляция» означает …

объединение в единое целое данных и алгоритмов обработки этих данных
свойство различных объектов выполнять одно и то же действие разными способами
способность объекта сохранять свойства и методы класса-родителя
заключение в отдельный модуль всех процедур работы с объектом
§ 1. Концепция ООП в языке программирования
Программирование как область человеческой деятельности прошло небольшой путь развития (пример 1.1). И, тем не менее, на этом пути можно выделить несколько этапов в развитии программирования:
- Машинно-ориентированное программирование.
- Структурное программирование.
- Модульное программирование.
- Объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП) – технология создания программ, основанная на использовании системы объектов. Каждый объект обладает набором свойств , которые описывают его состояние, и методов , характеризующих его поведение.
При использовании технологии ООП для решения задачи строится система взаимодействующих друг с другом элементов, которые и являются объектами. Каждый элемент этой системы, став активным, выполняет некую последовательность действий (меняет свое состояние, выполняет алгоритм обработки данных или активизирует другой элемент). Система, реализуя взаимодействие своих элементов, решает поставленную задачу (пример 1.2).
Ключевыми чертами объектно-ориентированного программирования являются: инкапсуляция, наследование и полиморфизм. Часто к ним добавляют абстрагирование (абстракцию).
Инкапсуляция — это определение пользовательских типов данных, объединяющих свое содержимое в единый тип и реализующих некоторые операции или методы над ними (пример 1.3).
Инкапсуляция объединяет вместе код и данные, исключает как вмешательство извне, так и неправильное использование данных. Данные и методы их обработки объединяются в «автономный черный ящик». Когда данные и методы их обработки связываются вместе подобным образом, создается объект. Иными словами, объект — это элемент, поддерживающий инкапсуляцию. В языке программирования инкапсуляция позволяет скрывать детали реализации от пользователя объекта, контролировать доступ к данным и методам их обработки.
Наследование – способ определения нового типа, при котором этот тип наследует элементы существующего (свойства и методы), модифицируя или расширяя их (пример 1.4).
Наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. При наследовании основная функциональность родительского класса (предка) расширяется в производном подклассе, который называют дочерним классом (потомком). Создание объектов по принципу наследования порождает иерархическую структуру (пример 1.5). Если не пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. Благодаря наследованию достаточно определить у потомка лишь те свойства, которыми не обладал предок.
Полиморфизм — это свойство системы, которое позволяет единообразно ссылаться на объекты различных классов (обычно внутри некоторой иерархии). Другими словами — это возможность использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта (пример 1.6).
Свойства и методы потомка, унаследованные от родительского класса, можно при необходимости изменить. При этом метод или свойство сохраняют свое имя, но наделяются новым содержанием. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу или придающих объектам разные свойства.
Полиморфизм позволяет решать схожие по смыслу проблемы разными способами.
Абстрагирование означает выделение значимой информации и исключение из рассмотрения незначимой. Абстракция — это обобщение данных и поведения для класса, находящегося по иерархии выше текущего.
Абстрактный класс является классом, для которого нельзя создать экземпляр. Так в примере с компьютерными персонажами нет смысла создавать просто персонаж (или человекоподобного), будут создаваться гномы, эльфы, драконы, роботы и т. д.
За более чем сорокалетнюю историю ООП основные принципы, заложенные в первые объектные языки и системы, подверглись существенному изменению и дополнению. Задумывалось, что объектно-ориентированный код будет проще читать и понимать человеком, т. к. людям гораздо удобнее работать с реальными объектами, чем отдельно с набором данных и функциями. Представляя данные в программе как свойства объекта, а функции по обработке данных — как возможные методы объекта, мы приближаем процесс программирования к процессу описания метода решения задачи. Однако на сегодняшний день существуют и противники технологии ООП.
В примере 1.7 перечислены плюсы и минусы ООП.
- Программирование на машиноориентированном языке ассемблер позволяет работать на уровне аппаратных средств компьютера. Программист должен продумать размещение данных в памяти, эффективно использовать регистры процессора, обеспечить взаимодействие разрабатываемой программы с операционной системой.
- Поскольку многие этапы разработки программ на языке ассемблер приходилось повторять от программы к программе, то следующий этап развития программирования связан с появлением подпрограмм и развитием технологии структурного программирования, когда поставленная задача разбивается на независимые подзадачи, реализуемые с помощью подпрограмм.
- На следующем этапе развития группы подпрограмм стали объединять в программные модули. Подпрограммы внутри модуля используют одни и те же глобальные данные, которые на этом этапе развития становятся структурированными.
- Дальнейшее усложнение программ привело к тому, что данные и подпрограммы для их обработки стали объединять в единое целое. Это привело к созданию языков, использующих объектно-ориентированную технологию решения задач.
Пример 1.2. В компьютерной игре объектом может быть персонаж. Свойствами персонажа могут быть: раса, здоровье, сила, деньги, ловкость, скорость, координаты, очки рейтинга и др. В качестве методов могут выступать действия персонажа: движение, понятие, использование или бросок предмета, атака, лечение, разговор и др. Игрок, управляя персонажем может менять его состояние (увеличить или уменьшить здоровье, деньги; изменить координаты и др.). Активировав какое-то из действий, игрок вызывает определенный метод обработки данных. Если игрок атакует другого персонажа, то тем самым он активизирует другой объект со своими методами и свойствами.
Пример 1.3. Инкапсуляция (от лат. in capsule — в оболочке) — это заключение данных и функционала в оболочку. В объектно-ориентированном программировании в роли оболочки выступают классы. Они не только собирают данные и методы в одном месте, но и защищают их от вмешательства извне (сокрытие).
Для персонажа компьютерной игры все его характеристики и действия описываются в одном классе. Некоторые характеристики или действия могут быть скрытыми. Например, расу героя, после того как герой выбран, невозможно изменить. Или лечение, которое происходит с течением времени, недоступно для управления.
Пример 1.4. Обычно в компьютерных играх много различных персонажей, которые могут отличаться друг от друга. Родительский класс в этом случае может описывать только общие свойства и методы, которые затем будут расширяться у наследников. Например, от персонажа могут наследоваться герои и животные, которые даются герою в помощь.
Пример 1.5. Возможная иерархия персонажей компьютерной игры:

Пример 1.6. У разных персонажей может быть такое действие, как движение. Однако гномы и драконы будут передвигаться по-разному, гномы должны обходить препятствия, а дракон может лететь по прямой. Метод, реализующий перемещение, будет называться одинаково, а реализовываться по-разному. Для игрока достаточно выбрать точку, в которую персонаж должен переместиться.
Первым языком программирования, в котором были предложены основные понятия, впоследствии сложившиеся в парадигму ООП, была Симула, но термин «объектная ориентированность» не использовался в контексте использования этого языка. В момент его появления в 1967 году в нём были предложены революционные идеи: объекты, классы, виртуальные методы и др. Новый взгляд на программирование предложили в 1970‑х годах Алан Кэй и Дэн Ингаллс в языке Smalltalk. Здесь понятие класса стало основообразующей идеей для всех остальных конструкций языка. Именно этот язык стал первым широко распространённым языком объектно-ориентированного программирования.
Пример 1.7. Плюсы и минусы ООП.
- легко читается;
- быстро пишется;
- проще реализовать большой функционал;
- меньше повторений, поскольку не нужно писать однотипные функции для разных сущностей.
- потребляет больше памяти;
- снижает производительность, поскольку многие вещи технически реализованы иначе, поэтому они используют больше ресурсов.
Объект — это совокупность данных и методов работы с ними.
Организация данных внутри объекта скрыта от пользователя. Данные и способы их чтения и записи являются свойствами объекта, которые можно изменять. Методы — это подпрограммы для обработки данных (пример 1.8).
В программировании объект — это экземпляр класса. По сути, класс является планом, структурой объекта. А объект представляет конкретное воплощение класса, его реализацию.
Класс — это тип данных, определяемый пользователем. Данные, которыми можно характеризовать объект класса, называют полями . Функции, которые могут выполнять какие-либо действия над данными (свойствами) класса, называют методами .
Каждая переменная типа «класс» является объектом. Объект класса определяется конкретным значением переменных, которое описывают состоянием объекта.
Классы обеспечивают сокрытие данных, их инициализацию, неявное преобразование пользовательских типов, средства для перегрузки операций и др.
С понятием класса как типа данных вы познакомились в 10 классе. В примере 1.9 приведены описания классов, которые разбирались ранее.
Метод класса, который гарантирует, что он не будет изменять объект или вызывать другие методы, которые могут его изменить, называют константным методом .
Чтобы сделать метод константным, нужно просто добавить ключевое слово const к объявлению функции после списка параметров, но перед телом функции (пример 1.10). Для методов, определенных вне тела класса, ключевое слово const должно использоваться как в объявлении функции (в теле класса), так и в определении функции.
Пример 1.8. Объекты операционной системы имеют контекстное меню, в котором находится список действий, которые можно над объектом выполнить. Каждое из действий вызывает на работу определенный метод, который описан в программе. В контекстном меню обычно находится строка «Свойства», которая позволяет изменять свойства объекта.
Пример 1.9. Описание классов.
Класс для описания точки на плоскости. Поля — координаты точки, метод — вычисление угла наклона к оси OX отрезка, соединяющего начало координат с точкой.
class Tchk
double x , y ;
double ugol ();
double Tchk :: ugol ()
double tg = y / x ;
return atan ( tg ) * 180 / acos (- 1 );
Класс для описания даты. Поля — день, месяц, год. Метод — вывод даты на экран с разделителем «.»:
class Date
int d , m , g ;
void print ();
void Date :: print ()
Пример 1.10. Использование константного метода:
class Date
int d , m , g ;
void print () const ;
void Date :: print () const
1. Что понимают под объектно-ориентированным программированием?
2. Что такое объект?
3. Что такое класс?
4. Какими ключевыми характеристиками обладает ООП?


1. Повторите материал из §22 учебного пособия для 10 класса (http://profil.adu.by/mod/book/view.php?id=3574).
2. Проанализируйте как изменялось описание класса date в примерах 22.1, 22.3, 22.4, 22.5.
3. Добавьте в описание класса метод типа bool, который будет возвращать значение true, если год високосный и false, если нет.
4. Добавьте метод, который для даты будет выводить пору года, которой принадлежит дата.
В объектно ориентированном программировании определенный пользователем тип данных который обладает
Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием, — прототипов).
Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области.
Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и линковки) исходного кода на выполнение).
Прототип — это объект-образец, по образу и подобию которого создаются другие объекты.
История
Объектное и объектно-ориентированное программирование (ООП) возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны. Кроме того, в современном объектно-ориентированном программировании часто большое значение имеют понятия события (так называемое событийно-ориентированное программирование) и компонента ( компонентное программирование).
Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.
В настоящее время количество прикладных языков программирования ( список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. В области системного программирования до сих пор применяется парадигма процедурного программирования, и общепринятым языком программирования является язык C. Хотя при взаимодействии системного и прикладного уровней операционных систем заметное влияние стали оказывать языки объектно-ориентированного программирования. Например, одной из наиболее распространенных библиотек мультиплатформенного программирования является объектно-ориентированная библиотека Qt, написанная на языке C++.
Главные понятия и разновидности
Структура данных « класс», представляющая собой объектный тип данных, внешне похожа на типы данных процедурно-ориентированных языков, такие как структура в языке Си или запись в Паскале или QuickBasic. При этом элементы такой структуры (члены класса) могут сами быть не только данными, но и методами (то есть процедурами или функциями). Такое объединение называется инкапсуляцией.
Основные понятия
Абстракция данных Объекты представляют собой упрощенное, идеализированное описание реальных сущностей предметной области. Если соответствующие модели адекватны решаемой задаче, то работать с ними оказывается намного удобнее, чем с низкоуровневым описанием всех возможных свойств и реакций объекта. Инкапсуляция Инкапсуляция — это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов. Сокрытие данных Сокрытие данных — неотделимая часть ООП, управляющая областями видимости. Является логическим продолжением инкапсуляции. Целью сокрытия является невозможность для пользователя узнать или испортить внутреннее состояние объекта. Наследование Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка (прародителя, иногда его называют суперклассом) и добавляя, при необходимости, новые свойства и методы. Набор классов, связанных отношением наследования, называют иерархией. Наследование призвано отобразить такое свойство реального мира, как иерархичность. Полиморфизм Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами — из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.
- Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.
- Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.
Предостережение: Одна из наиболее распространенных ошибок — делать сокрытие реализации только ради сокрытия. Целями, достойными усилий, являются:
- предельная локализация изменений при необходимости таких изменений,
- прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.
Образ в пример: ложка, опущенная в стакан, не меняет его свойств и не становится частью стакана, хотя и помогает пить из него чай; в то же время, сахар, растворенный в чае с помощью ложки, делает его сладким.
Часто инкапсуляция может быть достигнута простейшими организационными мерами: знание того, что «вот так-то делать нельзя» иногда является самым эффективным средством инкапсуляции!
C++
class A
public:
int a, b; //данные открытого интерфейса
int ReturnSomething(); //метод открытого интерфейса
private:
int Aa = a, Ab = b; //скрытые данные и использование ими интерфейса
void DoSomething(); //скрытый метод
>;
Класс А инкапсулирует свойства Aa, Ab и метод DoSomething, представляя внешний интерфейс ReturnSomething, a, b.
Полиморфизм (в языках программирования) — возможность объектов с одинаковой спецификацией иметь различную реализацию
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования [1] .
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение:
- внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством);
- внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).
Примеры
Класс геометрических фигур ( эллипс, многоугольник) может иметь методы для геометрических трансформаций ( смещение, поворот, масштабирование).
Класс потоков имеет методы для последовательной передачи данных. Потоком может быть информация, вводимая пользователем с терминала, обмен данными по компьютерной сети, файл (если требуется последовательная обработка данных, например, при разборе исходных текстов программ).
В объектно-ориентированных языках
В объектно-ориентированных языках класс является абстрактным типом данных. [Прим. 1] Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом класса-родителя, но при этом вместо него во время исполнения будет подставляться один из классов-потомков. Это называется поздним связыванием.
Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.
Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая « Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема путём отказа от множественного наследования для классов и разрешением множественного наследования для полностью абстрактных классов (т. е. интерфейсов) ( C#, Delphi, Java), либо через виртуальное наследование ( C++).
Наследование — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Типы наследования
Простое наследование
Класс, от которого произошло наследование, называется базовым или родительским ( англ. base class ). Классы, которые произошли от базового, называются потомками, наследниками или производными классами ( англ. derived class ).
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.
Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ ( Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.
Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе.
Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживает возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.
Единый базовый класс
В ряде языков программирования все классы явно или неявно наследуются от некого базового класса. Smalltalk был одним из первых языков, в которых использовалась эта концепция. К таким языкам относятся Objective-C ( NSObject ), Java ( java.lang.Object ), C# ( System.Object ), Delphi ( TObject ).
Наследование в языке C++
class A //базовый класс
>;
class B : public A //public наследование
>
class C : protected A //protected наследование
>
class Z : private A //private наследование
>
В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:
- при public-наследовании все спецификаторы остаются без изменения.
- при protected-наследовании все спецификаторы остаются без изменения, кроме спецификатора public, который меняется на спецификатор protected (то есть public-члены базового класса в потомках становятся protected).
- при private-наследовании все спецификаторы меняются на private.
Одним из основных преимуществ public-наследования является то, что указатель на классы—наследники может быть неявно преобразован в указатель на базовый класс, то есть для примера выше можно написать:
A* a = new B;
3. Понятие класса
В класс объединяются объекты с одинаковыми свойствами и методами.
Одним из первых действий, предпринимаемых человеком при попытке понять окружающий мир, является применение к нему некоторой структурной формы. При встрече с неизвестным объектом мы пытаемся втиснуть его в нашу существующую структуру: другими словами, классифицировать его. Большинство людей знакомо по крайней мере с несколькими классификационными структурами или иерархиями.
Использование иерархии классов вводит необходимость абстракции. Классы становятся более абстрактными по мере продвижения вверх по иерархии.
Объектно-ориентированные языки используют такой же подход. Иерархии обычно начинаются с нескольких абстрактных классов. Каждый новый класс представляется как подкласс существующего класса (называемого его суперклассом). Он наследует данные и методы от классов, стоящих выше в иерархии. Только те данные и методы, которые являются новыми для этого класса, следует определить и реализовать.
Класс — это абстрактное понятие, сравнимое с понятием категория в его обычном смысле.
По определенным свойствам любого элемента определенной категории можно установить, что он принадлежит к этой категории. Сама категория определяется общими свойствами, которые имеют все экземпляры этой категории.
Это можно пояснить на примере музыкальных инструментов. Музыкальные инструменты делятся на следующие категории: духовые, ударные и струнные.
Все эти категории принадлежат к категории музыкальных инструментов. В свою очередь, категория музыкальных инструментов входит в категорию инструментов. На рис.1 эта структура категорий графически представлена в виде дерева.
Музыкальные инструменты имеют общие свойства, но каждый инструмент сам по себе обладает особыми свойствами, которые определяют его назначение и отличают его от других инструментов. По тому же принципу можно описать и классы в ООП. Определенный музыкальный инструмент некоторой категории, например труба, является объектом. Категория, к которой этот инструмент принадлежит, — это класс.
Класс в объектно-ориентированном программировании — это абстрактный тип данных, который включает не только данные, но и функции и процедуры.
Функции и процедуры класса называются методами и содержат исходный код, предназначенный для обработки внутренних данных объекта данного класса.
Наличие в классах абстрагирования, которое максимально удобно для программистов, работающих с этими классами, имеет первостепенное значение при разработке повторно используемого ПО. Если вы выстроите интерфейс, на который не влияют изменения в реализации, то вашему приложению долгое время не понадобятся никакие модификации. Если вы знакомы с предметной областью задачи, вы без труда определите, какие методы понадобятся пользователям класса. Скажем так: если при проектировании класса вам удается сочетать хорошее знание предметной области с прогнозом относительно дальнейших перспектив использования класса, можно гарантировать, что большая часть интерфейса этого класса останется неизменной, даже в случае возможного совершенствования реализации класса. В результате отстранения пользователя от деталей реализации система в целом становится понятнее, а значит, и удобнее в работе.
Между классами также могут быть установлены отношения:
— отношение разновидности (кошка — вид определенного биологического семейства или кошка — домашнее животное);
— включения или составной части (лапа — часть кошки);
— ассоциативности, когда между классами есть чисто смысловая связь (кошки и собаки — домашние животные).