- •Лабораторная работа №2
- •Основы объектно-ориентированного программирования
- •Инкапсуляция
- •Полиморфизм
- •Абстракция данных
- •Виды классов
- •Структура класса
- •Отношения между классами
- •Области доступа
- •Советы по использованию уровня доступа
- •«Паблик Морозов»
- •Абстрактный метод
- •Абстрактный класс
- •Виртуальный метод
- •Интерфейс
- •Диаграммы классов
- •Задание
Виды классов
Существуют следующие, основные виды классов:
Базовый (родительский класс). Базовый класс содержит данные и методы, общие для всех его потомков. Например: класс «Автомобиль» может содержать свойство «Количество колёс», которое будет общим для всех его потомков, если подразумевается, что все автомобили имеют колёса;
Производный класс (наследник, потомок). Производный класс содержит собственные методы и данные, которые расширяют функциональность базового класса. Например: класс «Автобус» может хранить номер маршрута;
Абстрактный класс (виртуальный) класс. Данный класс может быть как базовым, так и производным. Основное отличие заключается в том, что нельзя создавать экземпляры данного класса (объекты).
Структура класса
В качестве основных составляющих класса (общих для всех объектно-ориентированных языков программирования) являются:
Поля. В полях хранятся данные класса. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени;
Определение поля выглядит следующим образом:
class Parent
{
int _value;
}
В данном примере объявлено поле класса с именем «_value» с типом int
Обычно каждому объекту соответствуют собственные значения всех его полей. Можно объявить поле, которое будет единым для всех экземпляров класса. Такие поля называются статическими. Внутри класса к данному полю можно обращаться по его имени. Снаружи класса для доступа к полю необходимо обращаться через имя класса.
Определение статического поля выглядит следующим образом:
class Parent
{
static int _value;
}
Обращение к статическому полю, не внутри класса выглядит следующим образом:
Parent._value = 10;
Свойства. Свойства необходимы для того, чтобы управлять доступом к полям класса. При проектировании классов необходимо иметь возможность управлять процессом установки значений полям класса, которые делаются как из других, так и из дочерних классов.
Определение свойства для поля выглядит следующим образом:
class Parent
{
int _value;
int Value
{
get
{
Return _value;
}
set
{
_value = value;
}
}
}
В данном примере, в разделе «get» возвращается значение свойства, а в разделе «set» устанавливается. Один из разделов может отсутствовать, тогда свойство будет либо только на чтение, либо только на запись. То, что возврат и установка значений делается в блоке кода, даёт возможность контроля за значениями.
Методы. Методы позволяют управлять данными класса и производить различные вычисления.
Определение метода выглядит следующим образом:
class Parent
{
int _value;
int Calculate(int parAmount)
{
return _value + parAmount;
}
}
В данном примере объявлено поле класса с именем «_value» с типом int
Конструктор. Специальный метод класса в объектно-ориентированном программировании, служащий для инициализации объекта при его создании. Конструктором класса называется функция, имеющая то же имя, что и сам класс, и не возвращающая никакого значения. Говоря более простым языком, конструктором называется тот метод класса, который вызывается автоматически при создании экземпляра класса. Имя конструктора должно совпадать с именем класса. Допускается использовать несколько конструкторов с одинаковым именем, но различными параметрами.
Определение конструктора выглядит следующим образом:
class Parent
{
Parent()
{
}
}
Различают следующие, основные, виды конструкторов:
Конструктор по умолчанию. Конструктор не имеющий аргументов. В отсутствие явно заданного конструктора по умолчанию его код генерируется компилятором (что в исходном тексте, не отражается). Пример конструктора по умолчанию указан выше;
Конструктор копирования. Конструктор, аргументом которого является ссылка на объект того же класса. Используется, если при создании нового объекта, в него нужно скопировать данные из другого, аналогичного типа.
Определение конструктора копирования выглядит следующим образом:
class Parent
{
int _value = 0;
Parent(Parent parParentCopy)
{
_value = parParentCopy._value;
}
}
Деструктор. Специальный метод класса, служащий для деинициализации объекта (например освобождения памяти). Имя деструктора должно совпадать с именем класса и иметь префикс ~. У класса может быть только один деструктор. Деструктор не имеет модификатора доступа и параметров.
Определение деструктора выглядит следующим образом:
class Parent
{
~Parent()
{
}
}
