Файл: Понятия объектно-ориентированного программирования.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 14.06.2023

Просмотров: 312

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

    • архитектуры компьютеров (Burroughs 5000, Plessey 250, IBM System/38, Intel 432);
    • объектно-ориентированных операционных систем (Plessey/System 250, Secure UNIX, StarOS, iMax);
    • объектно-ориентированных языков программирования (Simula, Smalltalk, Modula);
    • теории баз данных (модели «сущность-связь»);
    • систем искусственного интеллекта (фреймы)[9].

При разработке программного обеспечения и автоматизированных информационных систем понятие «объект» впервые было введено Оле-Джоаном Далем, Бьорном Мюрхогом и Кристеном Ныгардом из Норвежского вычислительного центра, расположенного в городе Осло. Названные специалисты разработали язык Simula 67, который был создан на основе языка Algol-60 и предназначался для моделирования и описания сложных систем. Однако по-настоящему широкое распространение данной идеи было осуществлено при разработке языка SmallTalk в 1990 г. Аланом Кейем из Исследовательского центра фирмы Xerox (г. Пало-Альто). В SmallTalk применялись исключительно объектно-ориентированные конструкции.

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

Ниже рассматриваются некоторые второстепенные понятия объектно-ориентированного подхода.

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

Примерами фактических сущностей могут выступать такие предметы и явления, как автомобиль, регулирование движения или сам регулировщик. А примерами воображаемых сущностей могут служить такие процессы как методические рекомендации к сборке автомобиля или оптимальная конструкция светофора[10].

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


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

Каждый класс и соответственно объект могут быть охарактеризованы строго определенным числом атрибутов и методов. Настоящие значения атрибутов четко определяют настоящее состояние объекта. Набор методов и их алгоритмическая реализация определяют поведение объекта или их классов[11].

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

2.1 Классы

Класс – это абстрактное понятие, сравнимое с понятием категория в его обычном смысле.

По определенным свойствам этого элемента можно установить, что он принадлежит к какой-то категории. Сама категория определяется общими свойствами, которые имеют все экземпляры этой категории[12].

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

На рисунке 1 эта структура категорий представлена графически в виде дерева.

Рисунок 1 Дерево категорий примера «Музыкальные инструменты»

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

Класс в ООП – это абстрактный тип данных, который включает в себя не только данные, но и функции и процедуры.


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

Существует 2 способа включения метода в класс:

  1. Определение метода при описании класса.
  2. Объявление метода при описании, а его описание - при вызове.

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

Пример:

class A

{

int x, y;

int sum ( ) { return (x + y) ; }

} ;

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

Пример:

Class B

{

int x, y;

int sum ( )

} ;

int B::sum ( )

{

return (x + y) ;

}

Также как и структуры, классы можно задавать либо статически, либо динамически.

Например:

  • статически - Toplist foo;
  • динамически - Toplist *bar; bar=new Toplist;

Для статических и динамических классов применимы те же правила и принципы, что и для статических и динамических переменных[13].

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

Наследование – один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса[14].

Простое наследование: Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). В некоторых языках используются абстрактные классы.

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


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

Наследование классов — очень мощная возможность в объектно-ориентированном программировании. Оно позволяет создавать производные классы (классы наследники), взяв за основу все методы и элементы базового класса (класса родителя). Таким образом, экономится масса времени на написание и отладку кода новой программы. Объекты производного класса свободно могут использовать всё, что создано и отлажено в базовом классе. При этом мы можем в производный класс дописать необходимый код для усовершенствования программы: добавить новые элементы, методы и т.д. Базовый класс останется нетронутым[15].

Множественное наследование

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя.

Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе. Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.


Основные характеристики и важные особенности наследования:

  1. Наследование – это определение производного класса, который может обращаться ко всем элементам и методам базового класса за исключением тех, которые находятся в поле private;
  2. Синтаксис определения производного класса: class Имя_Производного_Класса: спецификатор доступаИмя_Базового_Класса { /*код*/ };
  3. Производный класс имеет доступ ко всем элементам и методам базового класса, а базовый класс может использовать только свои собственные элементы и методы.
  4. В производном классе необходимо явно определять свои конструкторы, деструкторы и перегруженные операторы присваивания из-за того, что они не наследуются от базового класса. Но их можно вызвать явным образом при определении конструктора, деструктора или перегрузки оператора присваивания производного класса, например таким образом (для конструктора): Конструктор_Производного_Класса (/*параметры*/) : Конструктор_Базового_Класса ( /*параметры*/) { }.
  5. Еще один важный момент при наследовании – перегруженные функции-методы класса потомка. В данном примере мы его не рассматривали. Но чтобы вы знали, если в классе родителе и в его классах потомках встречаются методы с одинаковым именем, то для объектов класса потомка компилятор будет использовать методы именно класса потомка. Перегруженные методы класса потомка, могут вызывать методы класса родителя. В таком случае важно помнить, что необходимо правильно определить область действия с помощью оператора :: , иначе компилятор воспримет это, как вызов функцией самой себя[16].

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

Инкапсуляция (encapsulation) – это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый «чёрный ящик». Когда коды и данные объединяются таким способом, создаётся объект (object). Другими словами, объект - это то, что поддерживает инкапсуляцию[17].

Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.