Меню Рубрики

Что такое класс с точки зрения ооп

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

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

В современных объектно-ориентированных языков программирования (в том числе в php, Oberon, Ruby, Object Pascal) создание класса сводится к написанию некоторой структуры, содержащей набор полей и методов (среди последних особую роль играют конструкторы, деструкторы, финализаторы). Практически класс может пониматься как некий шаблон, по которому создаются объекты — экземпляры данного класса. Экземпляры одного класса созданы по одному шаблону, поэтому имеют один и тот же набор полей и методов.

Отношения между классами

  • Наследование (Генерализация) — объекты дочернего класса наследуют все свойства родительского класса.
  • Ассоциация — объекты классов вступают во взаимодействие между собой.
  • Агрегация — объекты одного класса входят в объекты другого.
  • Композиция — объекты одного класса входят в объекты другого и зависят друг от друга по времени жизни.
  • Класс-Метакласс — отношение, при котором экземплярами одного класса являются другие классы.

Виды классов

  • Базовый (родительский) класс
  • Производный класс (наследник, потомок)
  • Абстрактный класс
  • Виртуальный класс
  • Интерфейс

Эти виды классов описаны в статье Наследование, так как связаны именно с этим отношением.

Члены классов

Класс определяется как список своих членов. К членам класса относятся его поля (свойства) и функции (методы) .

Каждому члену класса можно установить его область доступа (access control level). Область доступа члена класса определяет участки кода, из которых к этому члену будет возможно обращаться. В большинстве объектно-ориентированных языков программирования поддерживаются следующие области доступа:

  • private (закрытый, внутренний член класса) — обращения к члену допускаются только из кода методов класса, в котором этот член определён. Любые наследники класса уже не смогут получить доступ к этому члену;
  • protected (защищённый, внутренний член иерархии классов) — обращения к члену допускаются из кода методов класса, в котором этот член определён, или из любых его классов-наследников;
  • public (открытый член класса) — обращения к члену допускаются из любого кода.

Область видимости

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

Область видимости самого класса по-разному определяется в разных языках программирования. В одних языках (таких как модуля), в других (таких как пакетом), в третьих (таких как C++ и C#) область видимости класса определяется пространствами имён (namespaces), которые задаются программистом явно и могут совпадать или не совпадать с единицами компиляции.

Классы в языке Delphi

На языке Delphi класс описывается следующим образом:

  • TMyClass — имя класса;
  • class — ключевое слово, начинающее определение класса;
  • TObject — класс-предок, если есть наследование;
  • private, protected, public, published — ключевые слова, обозначающие секции областей доступа.

Создается экземпляр (объект) класса так:

Классы в языке C++

Класс в языке C++ создаётся следующим образом:

После своего создания класс считается полноценным типом данных и, следовательно экземпляры класса создаются следующим образом:

Обращение к членам класса:

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

Классы в языке C Sharp

Классы в языке C# определятся следующим образом:

Классы в языке Python с помощью оператора class :

Создание экземпляра класса:

Уничтожение экземпляра класса:

Классы в языке Java с помощью оператора class :

Создание экземпляра класса:

Уничтожение экземпляра класса:

  • Creating Classes — Руководство по созданию классов в языке Классы — PPT-файл одной из лекций курса «Объектно-ориентированный анализ и дизайн»

Wikimedia Foundation . 2010 .

Смотреть что такое «Класс (ООП)» в других словарях:

Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия

Интерфейс (ООП) — Интерфейс (от лат. inter между и лат. face поверхность) это семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом. Интерфейс определяет границу… … Википедия

Хрупкий базовый класс — Хрупкий базовый класс фундаментальная проблема объектно ориентированного программирования. Описание Проблема хрупкого базового класса заключается в том, что малейшие правки в деталях реализации базового класса могут привнести ошибку в… … Википедия

Абстрактный класс — в объектно ориентированном программировании базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП полиморфизм. Абстрактный класс может содержать (и не содержать[1]) абстрактные … Википедия

Вспомогательный класс (информатика) — Вспомогательный класс (англ. Helper >Википедия

ActionScript — Класс языка: Объектно ориентированный, Императивный, скриптовый Появился в: 1998 Автор(ы): Гари Гроссман … Википедия

Объектно-ориентированное программирование — Эта статья во многом или полностью опирается на неавторитетные источники. Информация из таких источников не соответствует требованию проверяемости представленной информации, и такие ссылки не показывают значимость темы статьи. Статью можно… … Википедия

ООАП — Объектно ориентированное программирование (ООП) парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием прототипов). Класс это тип, описывающий… … Википедия

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

Полиморфизм (программирование) — У этого термина существуют и другие значения, см. Полиморфизм. Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью … Википедия

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

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

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

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

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

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

Класс – это описание множества объектов программирования (объектов) и выполняемых над ними действий.

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

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

Любая функция в программе представляет собой метод для объекта некоторого класса.

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

Вся программа в таком виде представляет собой объект некоторого класса с единственным методом run (выполнить).

Программирование «от класса к классу» включает в себя ряд новых понятий. Основными понятиями ООП являются

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

Внутри объекта коды и данные могут быть закрытыми или открытыми.

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

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

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

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

Иначе говоря, новый класс наследует как данные старого класса, так и методы их обработки.

Если объект наследует свои свойства от одного родителя, то говорят об одиночном наследовании . Если объект наследует данные и методы от нескольких базовых классов, то говорят о множественном наследовании .

Пример наследования – определение структуры, отдельный член которой является ранее определенной структурой.


Полиморфизм – это свойство, которое позволяет один и тот же идентификатор (одно и то же имя) использовать для решения двух и более схожих, но технически разных задач.

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

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

Например, нахождение абсолютной величины в языке Си требует трех разных функций с разными именами:

В C++ можно описать полиморфную функцию, которая будет иметь одинаковое имя и разные типы и наборы аргументов.

Блог о программировании

Наверное, в половине вакансий(если не больше), требуется знание и понимание ООП. Да, эта методология, однозначно, покорила многих программистов! Обычно понимание ООП приходит с опытом, поскольку годных и доступно изложенных материалов на данный счет практически нет. А если даже и есть, то далеко не факт, что на них наткнутся читатели. Надеюсь, у меня получится объяснить принципы этой замечательной методологии, как говорится, на пальцах.

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

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

Об объектах и классах

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

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

Читайте также:  Какие отрасли промышленности наиболее опасны с точки зрения экологии

Одним из самых распространенных объектно-ориентированных языков программирования является язык java. Там без использования объектов просто не обойтись. Вот как будет выглядеть код класса, описывающего треугольник на этом языке:

Если мы внутрь класса добавим следующий код:

то программу уже можно будет запускать на выполнение. Это особенность языка java. Если в классе есть такой метод

то этот класс можно выполнять. Разберем код подробнее. Начнем со строки

Здесь мы создаем экземпляр triangle1 класса Triangle и тут же задаем ему параметры сторон и угла между ними. При этом, вызывается специальный метод, называемый конструктор и заполняет поля объекта переданными значениями в конструктор. Ну, а строки

выводят рассчитанные площадь треугольника и его периметр в консоль.

Аналогично все происходит и для второго экземпляра класса Triangle .

Понимание сути классов и конструирования конкретных объектов — это уверенный первый шаг к пониманию методологии ООП.

Еще раз, самое важное:

ООП — это способ организации кода программы;

Класс — это пользовательская структура данных, которая воедино объединяет данные и функции для работы с ними(поля класса и методы класса);

Объект — это конкретный экземпляр класса, полям которого заданы конкретные значения.

Три волшебных слова

ООП включает три ключевых подхода: наследование, инкапсуляцию и полиморфизм. Для начала, приведу определения из wikipedia:

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.

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

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

Понять, что же все эти определения означают на деле достаточно сложно. В специализированных книгах, раскрывающих данную тему на каждое определение, зачастую, отводится целая глава, но, как минимум, абзац. Хотя, сути того, что нужно понять и отпечатать навсегда в своем мозге программиста совсем немного.
А примером для разбора нам будут служить фигуры на плоскости. Из школьной геометрии мы знаем, что у всех фигур, описанных на плоскости, можно рассчитать периметр и площадь. Например, для точки оба параметра равны нулю. Для отрезка мы можем вычислить лишь периметр. А для квадрата, прямоугольника или треугольника — и то, и другое. Сейчас же мы опишем эту задачу в терминах ООП. Также не лишним будет уловить цепь рассуждений, которые выливаются в иерархию классов, которая , в свою очередь, воплощается в работающий код. Поехали:

Итак, точка — это самая малая геометрическая фигура, которая является основой всех прочих построений (фигур). Поэтому именно точка выбрана в качестве базового родительского класса. Напишем класс точки на java:

У получившегося класса Point пустой конструктор, поскольку в данном примере мы работаем без конкретных координат, а оперируем только параметрами значениями сторон. Так как у точки нет никаких сторон, то и передавать ей никаких параметров не надо. Также заметим, что класс имеет методы Point::getSquare() и Point::getPerimeter() для расчета площади и периметра, оба возвращают 0. Для точки оно и логично.

Поскольку у нас точка является основой всех прочих фигур, то и классы этих прочих фигур мы наследуем от класса Point . Опишем класс отрезка, наследуемого от класса точки:

означает, что класс LineSegment наследуется от класса Point . Методы LineSegment::getSquare() и LineSegment::getPerimeter() переопределяют соответствующие методы базового класса. Площадь отрезка всегда равняется нулю, а площадь периметра равняется длине этого отрезка.

Теперь, подобно классу отрезка, опишем класс треугольника(который также наследуется от класса точки):

Тут нет ничего нового. Также, методы Triangle::getSquare() и Triangle::getPerimeter() переопределяют соответствующие методы базового класса.
Ну а теперь, собственно, тот самый код, который показывает волшебство полиморифзма и раскрывает мощь ООП:

Мы создали массив объектов класса Point , а поскольку классы LineSegment и Triangle наследуются от класса Point , то и их мы можем помещать в этот массив. Получается, каждую фигуру, которая есть в массиве figures мы можем рассматривать как объект класса Point . В этом и заключается полиморфизм: неизвестно, к какому именно классу принадлежат находящиеся в массиве figures объекты, но поскольку все объекты внутри этого массива принадлежат одному базовому классу Point , то все методы, которые применимы к классу Point также и применимы к его классам-наследникам.

Теперь о инкапсуляции. То, что мы поместили в одном классе параметры фигуры и методы расчета площади и периметра — это и есть инкапсуляция, мы инкапсулировали фигуры в отдельные классы. То, что у нас для расчета периметра используется специальный метод в классе — это и есть инкапсуляцию, мы инкапсулировали расчет периметра в метод getPerimiter() . Иначе говоря, инкапсуляция — это сокрытие реализции (пожалуй, самое короткое, и в то же время емкое определением инкапсуляции).

7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 13. ООП. Понятие класса

Лекция 13. Основные понятия ООП. Классы.

Основными понятиями ООП являются:

Абстракция – подразумевает разделение и независимое выполнение интерфейса и реализации (внутренние свойства объекта). Интерфейс – средство взаимодействия с другими объектами.

Модульность – предполагает скрытие деталей реализации.

Принцип абстракции обязывает использовать механизм запрета доступа или сокрытие компонент, который предотвращает умышленное или случайное изменение внутри реализации.

Абстрактный тип данных (АТД) — совокупность данных вместе со множеством операций над ними.

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

Для представления объектов в языке С# используется понятие класса.

КЛАСС — это обобщенное понятие, определяющее характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами класса. Класс содержит данные, задающее свойства объектов класса и функции (методы), определяющие их поведение. В классе могут присутствовать и события, на которые может реагировать объекты класса.

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

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

Класс относится к ссылочным типам данных, память под которые выделяется в хипе. Таким образом, экземпляры классов хранят не сами объекты, а ссылки на объекты, то есть их адреса.

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

Синтаксис описания класса:

[ атрибуты ] [ спецификаторы ] class имя_класса [ : предки ]

обязательными являются только ключевое слово class, а также имя и тело класса. Имя класса задается программистом по общим правилам C#. Тело класса – это список описаний его элементов, заключенный в фигурные скобки. Список может быть пустым, если класс не содержит ни одного элемента.

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

В начале изучения классов будут рассмотрены классы, которые описываются в пространстве имен непосредственно (то есть не вложенные классы). Для таких классов допускаются только два спецификатора: public и internal. По умолчанию, то есть если ни один спецификатор доступа не указан, подразумевается спецификатор internal.

Таблица 13.1 — Спецификаторы класса

1 new Используется для вложенных классов. Задает новое

описание класса взамен унаследованного от предка.

Применяется в иерархиях объектов

2 public Доступ не ограничен

3 protected Используется для вложенных классов. Доступ только из

элементов данного и производных классов

4 internal Доступ только из заданной области программы (сборки)

5 protected internal Доступ только из данного и производительных классов

или из данной программы (сборки)

6 private Используется для вложенных классов. Доступ только из

элементов класса, внутри которого описан данный класс

7 abstract Абстрактный класс. Применяется в иерархиях объектов

8 sealed Бесплодный класс. Применяется в иерархиях объектов

9 static Статический класс. Введен в версию языка 2.0.

Спецификаторы 2-6 называются спецификаторами доступа. Они определяют, откуда можно непосредственно обращаться к данному классу. Спецификаторы доступа могут присутствовать в описании только в вариантах, приведенных в таблице, а также могут комбинироваться с остальными спецификаторами.

Данные: поля и константы

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

При описании элементов класса можно так же указывать атрибуты и спецификаторы полей и констант, перечисленные в таблице 13.2, а для констант можно использовать только спецификаторы 1-6.

Таблица 13.2 — Спецификаторы полей и констант класса

1 new Новое описание поля, скрывающее указанный элемент

2 public Доступ к элементу не ограничен

3 protected Доступ только из данного и производных классов

4 internal Доступ только из данной сборки

5 private Доступ только из данного класса

6 static Одно поле для всех экземпляров класса

7 readonly Поле доступно только для чтения

8 volatile Поле может изменяться другим процессом или системой

По умолчанию элементы класса считаются закрытыми (private). Для класса этот вид доступа является предпочтительным, поскольку поля определяют внутреннее строение класса, которое должно быть скрыто от пользователя. Все методы класса имеют непосредственный доступ к его закрытым полям.

Поля, описанные со спецификатором static, а также константы существуют в единственном экземпляре для всех объектов класса, поэтому к ним обращаются не через имя экземпляра, а через имя класса. Если класс содержит только статические элементы, экземпляр класса создавать не требуется.

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

В примере приведен простой класс Demo и два способа обращения к его полям. Пример описания класса:

public int a = 1; //поля данных

public const double c = 1.66; //константа

public static string s = «Demo»;//статическое поле класса

double y; //закрытое поле данных

static void Main()

Console.WriteLine(x.a); //x.a — обращение к полю класса

//Console.WriteLine(x.c); //ОШИБКА! Константное данное!

Console.WriteLine(Demo.c); //Demo.c — обращение к константе

Console.WriteLine(Demo.s); //обращение к статическому полю

//Поле y вывести на экран аналогичным образом не удается: оно является //закрытым, то есть недоступно извне (из класса Class1) . Поскольку //значение этому полю явным образом не присвоено, среда присваивает ему //значение ноль.

В приведенном примере в классе Demo описаны только различные виды данных класса, без описания методов. Класс Demo – новый тип данных. Для описания переменной этого типа необходимо создать экземпляр (переменную класса, объект):

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

Функциональные элементы класса не тиражируется, то есть всегда хранятся в единственном экземпляре. Для работы с данными класса используются методы класса (статические методы), для работы с данными экземпляра – методы экземпляра, или просто методы.

Виды элементов класса

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

Ниже приведено краткое описание всех элементов класса:

Константы класса хранят неизменяемые значения, связанные с классом.

Поля содержат данные класса.

Методы реализуют вычисления или другие действия, выполняемые классом или экземпляром.

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

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

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

Индексаторы обеспечивают возможность доступа к элементам класса по их порядковому номеру.

Операции задают действия с объектами с помощью знаков операции.

События определяют уведомления, которые может генерировать класс.

Типы – это типы данных, внутренние по отношению к классу.

Читайте также:  Социальные сети с точки зрения теории коммуникации

Классы ООП. Объектно-ориентированное программирование

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

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

Опытные разработчики хорошо знают языки COBOL и C. Написанные на них программы представляли собой последовательность пошаговых инструкций. Они использовали процедуры и функции для того, чтобы сделать программу модульной. Эта парадигма была сосредоточена на логике, а не на данных, и на методах их объединения.

Современные языки программирования Delphi, Java, C# и другие следуют объектно-ориентированному подходу. При этом важность отдается данным, а не просто написанию инструкций для выполнения задачи. Объект — это вещь или идея, которую вы хотите смоделировать. Им может быть что угодно, например, сотрудник, банковский счет, автомобиль, различные предметы обстановки и так далее.

Понятие объектно-ориентированного программирования (ООП) неотъемлемо связано со следующими критериями:

  • Абстракция.
  • Инкапсуляция.
  • Наследование.
  • Полиморфизм.

Рассмотрим каждый из них более подробно.

Абстракция

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

Мы стараемся выборочно сосредоточиться только на тех вещах, которые важны для нас (в жизни) или для нашего модуля (в программировании). Изменение одного независимого модуля не влияет на другие. Единственное, что нужно знать, — это то, что он нам дает. Человек, который использует этот модуль, не должен беспокоиться о том, как задача решается, что именно происходит в фоновом режиме.

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

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

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

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

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

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

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

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

Полиморфизм

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

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

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

Наследование является одним из способов достижения полиморфизма, когда поведение, определенное в унаследованном классе, может быть переопределено путем написания пользовательской реализации метода. Это называется переопределением (полиморфизмом времени компиляции).

Существует еще одна форма полиморфизма, называемая перегрузкой, при которой наследование не учитывается. Имя метода будет таким же, но аргументы в методе разные.

Особенности понятий «класс» и «объект»

Чтобы начать работать с объектно-ориентированным программированием, нам нужно разобраться, что такое класс ООП и объект. Важно понимать разницу между ними. Класс — это план для создания объекта. Он определяет атрибуты и поведение. Это похоже на инженерный чертеж дома. Объект является экземпляром класса. Вот такая между ними разница. В примере ниже показано, каким образом объявляются класс «TForml» и переменная «Forml» на языке программирования Delphi:

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

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

Когда мы используем эти данные, мы создаем автомобиль с конкретными параметрами. Программируя один и тот же объект (машину), мы можем взять разные характеристики, как показано в таблице ниже:

Объект 1 Объект 2
модель: Ваз 2107 модель: Ваз 2109
топливо: Бензин топливо: Дизель
цвет: Красный цвет: Зеленый
метод запуска двигателя: Start () метод запуска двигателя: Start ()
метод торможения: Break () метод торможения: Break ()
метод ускорения: Acceleration () метод ускорения: Acceleration ()

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

Классы ООП состоят из элементов различных типов:

  1. Поля данных: хранят состояние класса с помощью переменных и структур.
  2. Методы: подпрограммы для манипулирования указанными данными.
  3. Некоторые языки допускают третий тип — свойства. Это что-то среднее между первыми двумя.

Поведение класса или его экземпляров определяется с помощью методов. Это подпрограммы с возможностью оперировать объектами. Данные операции могут изменить состояние объекта или просто предоставить способы доступа к нему.

Существует множество методов. Их поддержка зависит от языка. Одни создаются и вызываются кодом программиста, другие (специальные, такие как конструкторы, деструкторы и операторы преобразования) создаются и вызываются сгенерированным компилятором кодом. Язык может позволить программисту определять эти специальные методы.

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

Объект может иметь несколько ролей, а пользователи имеют возможность использовать его с разных точек зрения. Например, объект типа «человек» может иметь роли:

  • Солдата (с поведением «стреляй в противника»).
  • Мужа (с поведением «люби свою жену»).
  • Налогоплательщика (с поведением «плати налоги») и так далее.

Однако каждый объект реализует свое поведение по-своему: Миша платит налоги вовремя, Андрей с просрочкой, а Петр вообще этого не делает. То же можно сказать о каждом объекте и других ролях.

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

Хорошим примером являются кнопки на передней панели телевизора. Можно сказать, что они — это интерфейс между пользователем и электропроводкой на другой стороне корпуса прибора. Человек нажимает кнопку питания для включения и выключения электроприбора. В этом примере конкретный телевизор является экземпляром, каждый метод представлен кнопкой, а все вместе они составляют интерфейс. В своей наиболее распространенной форме он представляет собой спецификацию группы связанных методов без их реализации.

Конструктор

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

Следующий пример объясняет концепцию конструктора класса на C++ (распространенном языке программирования):

Когда приведенный выше код компилируется и выполняется, он дает следующий результат:

Деструктор

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

Синтаксис для деструктора такой же, как и для конструктора, однако имя класса используется в данном случае для него со знаком тильды «

» в качестве префикса.

Следующий пример на языке C++ объясняет понятие деструктора:

Когда приведенный выше код скомпилирован и выполнен, он даст следующий результат:

Length of line: 6

В чем заключаются достоинства классов

Преимущества организации программного обеспечения в классы объектов делятся на три категории:

  • Быстрое развитие.
  • Простота обслуживания.
  • Повторное использование кода и дизайна.

Классы и ООП в целом способствуют быстрой разработке, поскольку они уменьшают смысловой разрыв между кодом и пользователями. Это по достоинству оценили многие программисты. Благодаря этой системе аналитики могут общаться как с разработчиками, так и с пользователями, используя один и тот же словарь, говоря об учетных записях, клиентах, счетах и ​​так далее.

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

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Что такое класс в ООП

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

Когда Вы переходите от процедурных языков (Си, Pascal, Basic) к объектно-ориентированным (C#, Java, C++), первое, что вам нужно сделать – это сломать своё мышление относительно того, что программирование – это написание функций и их последовательный вызов в некоторой главной (main). В рамках ООП вам придётся мыслить более абстрактно и работать с классами, которые являются воплощением объектов реального мира. Казалось бы, почему мыслить в рамках реальных объектов – это значит мыслить более абстрактно?

В программировании, которое изначально было процедурным, переход в объектам – это переход на один уровень абстракции выше. Парадоксально, но новичкам на первых порах довольно сложно перейти к мышлению в рамках реальных объектов при написании кода. Но освоив объектно-ориентированное программирование, вы, несомненно, останетесь довольны, потому что его мощь позволит вам создавать сложные программы значительно быстрее. Мы же со своей стороны постараемся на примерах доходчиво объяснить, что такое класс, и как его использовать. Приступим.

Читайте также:  Сотовый телефон с точки зрения физики

Что такое класс?

В объектно-ориентированном программировании (ООП) – класс это основной элемент, в рамках которого осуществляется конструирование программ. Класс содержит в себе данные и код, который управляет этими данными.

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

Оговоримся, что данная статья исключительно для начинающих. В ней не рассматривается наследование, абстрактные классы и т.д.

Создание класса

Что имеет автомобиль? В частности, это:

  • марка;
  • цвет;
  • мощность (в л/с);
  • максимальная скорость (км/ч);
  • объём бака (л);
  • расход топлива (л) на 100 км пути.

Напишем класс Car (автомобиль) на C# (аналогично на Java):

Что такое ООП и с чем его едят?

Из своего опыта могу сказать, что всегда считал что понимал ООП, что же тут такого то — полиморфизм, инкапсуляция и наследование, но вот когда дошло до дела, то туговато пришлось. Хочу разложить всё по полочкам чтобы никто не наступил на мои грабли в будущем 🙂

Немного теории:

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

В центре ООП находится понятие объекта.

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

Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не означает его объектной ориентированности — для этого требуется наличие наследования.

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

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

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

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

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

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

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

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

Зачем же это нужно?

Думаю, вам бы не хотелось, чтобы кто-то, что-то изменял в написанной вами библиотеки.

И если это опытный программист, то это простить еще можно, но все равно не приятно, а вот если это начинающий или не осторожный который с легкой руки задумает изменить код, да ещё не в ту степь, нам ведь такого не хочется! Чтобы обезопасить себя от таких поступков, существует инкапсуляция.

Цель инкапсуляции – уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. Давайте рассмотрим, как ею пользоваться.

Существует 4 вида модификаторов доступа: public, protected, private и default.

Public – уровень предполагает доступ к компоненту с этим модификатором из экземпляра любого класса и любого пакета.

Protected – уровень предполагает доступ к компоненту с этим модификатором из экземпляров родного класса и классов-потомков, независимо от того, в каком пакете они находятся.

Default – уровень предполагает доступ к компоненту с этим модификатором из экземпляров любых классов, находящихся в одном пакете с этим классом.

Private – уровень предполагает доступ к компоненту с этим модификатором только из этого класса.

public String name; — имя, которое доступное из любого места в приложении.
protected String surname; — фамилия доступна из родного класса и потомков.
private int age; — возраст доступен только в рамках класса Human.
int birthdayYear; — хоть не указывается явный модификатор доступа, система понимает его как default, год рождения будет доступен всему пакету, в котором находится класс Human.

Для разных структурных элементов класса предусмотрена возможность применять только определенные уровни модификаторов доступа.

Для класса — только public и default.

Для атрибутов класса — все 4 вида.

Для конструкторов — все 4 вида.

Для методов — все 4 вида.

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

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

Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации.

Разберем этот механизм на классическом примере: Геометрические фигуры.

У нас есть интерфейс Figure:

Интерфейс (более детально будут рассмотрены в скором будущем) — нам говорит, как должен выглядеть класс, какие методы в себе содержать, какими переменными и типами данных манипулировать. Сам интерфейс не реализует методы, а создает как бы скелет для класса, который будет расширять этот интерфейс. Есть класс Figure, который расширяет интерфейс Figure:

В этом классе мы реализуем все методы интерфейса Figure.

public class Figure implements devcolibri.com.oop.inheritance.interfaces.Figure — с помощью ключевого слова implements мы перенимаем методы интерфейса Figure для реализации.

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

И соответственно у нас есть 3 класса самих фигур, которые наследуются от класса Figure. Класс Figure является родительским классом или классом-родителем, а классы Circle, Rectungle и Triangle — являются дочерними.

public class Triangle extends devcolibri.com.oop.inheritance.Figure — это значит, что класс Triangle наследует класс Figure.

super.setColor(colour); — super модификатор, позволяющий вызывать методы из класса родителя.

Теперь каждый класс перенял свойства класса Figure. Что собственно это нам дало?

Значительно уменьшило время разработки классов самих фигур, дало доступ к полям и методам родительского класса.

Наверное возник вопрос: чем же extends отличается от implements?

Extends дает нам намного гибче подход. Мы используем только те методы, что нам нужны, в любой момент мы можем изменить каркас и тело метода, или добавить совсем новый метод, который возможно будет использовать информацию от класса родителя, а implements все лишь формирует тело класса.

В дочерних классах мы можем спокойно добавлять новые интересующие нас методы. Например, мы хотим добавить в класс Triangle 2-а новых метода: flimHorizontal () и flipVertical ():

Теперь эти 2-а метода принадлежат сугубо классу Triangle. Этот подход используется когда базовый класс не может решить всех проблем.

Или можно использовать другой подход, изменить или переписать методы в дочерним классе:

Довольно интересный факт: в java запрещено множественное наследование, но любой из классов по умолчанию наследуется то класса Object. То есть при наследовании любого класса у нас получается множественное наследование)

Но не стоит забивать этим голову!

Полиморфизм.

В более общем смысле, концепцией полиморфизма является идея “один интерфейс, множество методов“.

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

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

Прежде всего, нужно сказать, что такое объявление корректно.

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

Компилятор может опираться только на тип ссылки, с помощью которой происходит обращение к полю:

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

Данное объявление так и называется – «скрывающим». Родительское поле продолжает существовать.

К нему можно обратиться явно:

Переменные b и c получат значения, родительского поля a. Хотя выражение с super более простое, оно не позволит обратиться на два уровня вверх по дереву наследования.

А ведь вполне возможно, что в родительском классе это поле также было скрывающим и в родителе родителя храниться ещё одно значение.

К нему можно обратиться явным приведением, как это делается для b.

Каков будет результат для new Child.printX(); ?

Метод вызывается с помощью ссылки типа Child, но метод определен в классеParent и компилятор расценивает обращение к полю x в этом методе именно как к полю класса Parent. Результатом будет .

Рассмотрим случай переопределения методов:

Родительский метод полностью перекрыт.

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

Хотя старый метод снаружи недоступен, внутри класса-наследника к нему можно обратиться с помощью super.

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

Абстракция:

Как говорилось в начале статьи, нельзя игнорировать абстракцию, а значит и абстрактные классы и методы.

В контексте ООП абстракция это обобщение данных и поведения для типа, находящегося выше текущего класса по иерархии.

Перемещая переменные или методы из подкласса в супер класс, вы обобщаете их. Это общие понятия, и они применимы в языке Java. Но язык добавляет также понятия абстрактных классов и абстрактных методов.

Абстрактный класс является классом, для которого нельзя создать экземпляр.

Например, вы можете создать класс Animal (животное). Нет смысла создавать экземпляр этого класса: на практике вам нужно будет создавать экземпляры конкретных классов, например, Dog (собака). Но все классы Animal имеют некоторые общие вещи, например, способность издавать звуки. То, что Animal может издавать звуки, еще ни о чем не говорит.

Издаваемый звук зависит от вида животного.

Как это смоделировать?

Определить общее поведение в абстрактном классе и заставить подклассы реализовывать конкретное поведение, зависящее от их типа.

В иерархии могут одновременно находиться как абстрактные, так и конкретные классы.

Использование абстракции:

Наш класс Person содержит некоторый метод поведения, и мы пока не знаем, что он нам необходим. Удалим его и заставим подклассы реализовывать это поведение полиморфным способом. Мы можем сделать это, определив методы Person как абстрактные. Тогда наши подклассы должны будут реализовывать эти методы.

Что мы сделали в приведенном выше коде?

Мы изменили Person и указали методы как abstract , заставив подклассы реализовывать их.
Мы сделали Adult подклассом Person и реализовали эти методы.
Мы сделали Baby подклассом Person и реализовали эти методы.

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

Теперь, поскольку Adult и Baby являются подклассами Person , мы можем обратиться к экземпляру каждого класса как к типу Person.

Источники:
  • http://prog-cpp.ru/oop/
  • http://codengineering.ru/post/21
  • http://studfiles.net/preview/5548261/
  • http://fb.ru/article/456799/klassyi-oop-obyektno-orientirovannoe-programmirovanie
  • http://vscode.ru/articles/chto-takoe-klass-v-oop.html
  • http://devcolibri.com/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BE%D0%BE%D0%BF-%D0%B8-%D1%81-%D1%87%D0%B5%D0%BC-%D0%B5%D0%B3%D0%BE-%D0%B5%D0%B4%D1%8F%D1%82/