Вы находитесь на странице: 1из 50

Основы объектно-

ориентированного
программирования

Чернойван Василий Александрович


vchernoivan@gmail.com
http://chernoivan.ru/oop
Абстрактные классы.
Интерфейсы. Полиморфизм.
Пример: графический редактор
• Эта программа дает возможность
редактировать рисунки:
– Составлять рисунок из фигур:
• Кругов
• Отрезков
– Добавлять, удалять, перемещать, изменять
размеры фигур
– Отрисовывать (показывать) рисунок
Первый подход Можно так

Приве
т

А хочется так
Графический редактор:
Наследование
Полиморфизм
• Полиморфизм – определение конкретики
поведения типом объекта

Полиморфизм – свойство объектов решать


одинаковые проблемы разными способами

Полиморфизм – возможность переопределения


поведения, которое уже используется
Абстрактные классы
Абстрактные классы
• Классы, которые содержат абстрактные методы
называются абстрактными
• Нельзя создать экземпляр абстрактного класса
• А ссылку на абстрактный класс – можно!
• Указывает на экземпляр производного класса
• Абстрактные методы должны быть
переопределены в производных классах
Абстрактные классы

• Абстрактные методы предоставляют из себя


интерфейс без реализации.

• Конкретика реализации «отложена» до


определения производных классов
Интерфейсы
• Специальная конструкция С#: interface
• Интерфейс описывает «чистое поведение», или
«чистую ответственность»
• Интерфейс не содержит реализации
т. е. все методы являются абстрактными
• Экземпляр интерфейса создать нельзя, а ссылку
на интерфейс – можно
• Поведение можно задать в произвольном классе
реализовав интерфейс (определив реализацию
всех методов интерфейса)
• Классы Circle, Line и Point
реализуют интерфейс IShape
Использование интерфейсов
Диаграмма классов: реализация

• Классы Circle, Line и Point


реализуют интерфейс IShape
Интерфейсы, итог
• Интерфейс — требования к реализации и
использованию
• Интерфейс можно рассматривать как контракт
между пользователями класса, реализующего
интерфейс, и авторами этого класса
• С точки зрения модели интерфейс это роль,
которую играет объект
• Ролей у одного объекта может быть несколько
Домашнее задание
• Что такое «позднее связывание» и «таблица
виртуальных функций». Как они связаны с
полиморфизмом
Взаимодействие с пользователем
Процедурный подход
Помощь
Недостатки процедурного подхода
• Что если мы разделили задачу – Оля пишет
сохранение и загрузку из файлов, Петя- всё
остальное. Как они будут работать с одним
файлом?
• Процедура вывода помощи никак не связана с
обработкой, что если мы захотим изменить имена
команд?
• Что если мы захотим расширить функционал,
например, добавить детальные инструкции по
каждой команде или синонимы для команд?
Взаимодействие с пользователем:
ОО подход
Команды
• Представим каждое действие в виде
объекта «команда», а программу – в виде
совокупности команд
• У каждой команды есть имя – ключ,
который её вызывает
• У каждой команды есть описание для
вывода инструкций
• Каждая команда определяет поведение –
выполнение команды
UML диаграмма классов: Команды
Интерфейс «Команда»
Команда «Выход из программы»
• Как «связать» разные команды в
одну программу?
Приложение — совокупность команд
• Как команды «узнают» об
объектах, с которыми нужно
работать?
Взаимодействие с приложением
Класс «приложение»
Команда «помощь»
Добавляем специфику
конкретного приложения - по вкусу

• Для каждой конкретной команды нужно


написать отдельный класс и реализовать
ICommand
Регистрация команд и запуск
приложения
Метод Application.Run
ОО подход: итог

• ХО-ХО! Мы получили почти в 3 (!) раза


больше кода

НО
ОО подход: итог
• Теперь мы можем использовать код повторно: не
нужно каждый раз заново писать
взаимодействие с пользователем, повторяя
старые ошибки.
Можно сосредоточиться на функциональности!
• Мы получили хорошо определенную
расширяемую схему работы с пользователем,
которая лишена недостатков процедурного
подхода
• «Лишний» код в основном состоит из
определений классов, которые современные IDE
позволяют генерировать
Поведение объектов:
Какие бывают методы
Методы
Методы объявляются в классе  путем указания
модификаторов (public, private, virtual и т. п.),
возвращаемого значения, имени метода и списка
параметров этого метода. 

Все вместе эти элементы образуют прототип


метода.
Тип возвращаемого значения, имя метода и типы
параметров образуют сигнатуру метода

Набор инструкций реализации называют телом


метода
Специальные методы
• Конструктор
– Операция создания объекта и/или его
инициализации
• Деструктор
– Операция, обратная конструктору
• Свойства
– Семантика доступа к состоянию
(чтение/установка полей)
Конструкторы
Конструкторы
• Конструктор – метод с именем, которое
совпадает с именем класса
• Конструктор не возвращает значений
• Конструктор вызывается с помощью
ключевого слова new
• Конструктор без параметров называется
конструктором по умолчанию
• Если ни один конструктор не указан,
компилятор создает конструктор по
умолчанию самостоятельно
Деструкторы

• На платформе .Net реализовано


автоматическое управление памятью,
поэтому деструкторы в большинстве простых
случаев не нужны
Деструкторы
• Деструктор – метод с именем, которое
начинается с символа ~ и далее совпадает с
именем класса
• Деструктор не возвращает значений
• Деструктор нельзя вызвать явно, он
вызывается всегда автоматически при
освобождении памяти
• Нельзя рассчитывать, что деструктор будет
вызван при выходе из кода, где используется
переменная
Конструкторы, деструкторы и
наследование
Конструкторы, деструкторы и
наследование
• Конструкторы базовых классов можно вызвать
явно с помощью ключевого слова base
• Конструктор может вызвать другой конструктор с
помощью ключевого слова this
• Конструкторы базовых классов обязательно
вызываются перед вызовом конструкторов
производных классов.
• Если не указано явно, вызывается базовый
конструктор по умолчанию
• Деструкторы базовых классов вызываются неявно,
в порядке, обратном конструкторам
Свойства
Свойства
• Свойства задаются именем и парой функций со
специальными названиями get и set без явных
параметров
• get возвращает значение, тип которого
определяется типом свойства
• В set доступна специальная переменная value,
тип которой определяется типом свойства
• Если опустить одну из функций, получится
свойство доступное только для чтения или только
для записи
• Отсутствие тела у методов get/set означает
доступ к анонимному закрытому (private)полю
Статические члены классов
Статические члены классов
• Статические члены класса это поля и методы
(кроме деструктора), которые принадлежат
классу, а не его экземплярам
• Статический конструктор вызывается
автоматически до того, как будет создан хотя бы
один экземпляр класса или вызван хотя бы один
метод, должен быть приватным.
• Класс, в котором есть только статические члены,
называется классом-утилитой и может быть
помечен как static
• Для доступа к статическим членам используются
не переменные , а имя класса
Параметры методов
Передача параметров по ссылке
и значению
• По умолчанию при передаче параметра
происходит копирование параметра
• Параметр можно передать по ссылке,
используя ключевые слова out или ref
• out - для случая, когда инициализация
переданного параметра не требуется
• ref - для случая, когда инициализация
требуется
Необязательные и именованные
параметры
• Для параметра можно задать значение по
умолчанию. Оно используется, если при
вызове параметр опущен.
• При использовании имен в передаче
параметров порядок передачи параметров
соблюдать необязательно
Спасибо за внимание

Вопросы?