- •Роль инкапсуляции
- •Роль наследования
- •Роль полиморфизма
- •Конструкторы
- •Конструктор копирования
- •Деструкторы
- •Перегрузка методов
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка унарных операторов
- •Выполнение операций со встроенными в с# типами данных
- •Переопределение методов Перекрытие методов
- •Сокрытие методов
- •Вызов базовых версий методов
- •Область видимости переменных
- •Конфликты областей видимости локальных переменных
- •Конфликты областей видимости полей и локальных переменных
- •Константы
- •Модификаторы доступа
- •Пространства имен
- •Uml. Диаграмма вариантов использования. Привести пример.
- •Чтение схем вариантов использования
- •Субъекты, варианты использования и подсистемы
- •Структурирование вариантов использования
- •Количество элементов между субъектами и вариантами использования
- •Задание количества элементов в ассоциации
- •Uml. Диаграмма классов. Привести пример.
- •Типы атрибутов и операций
- •Несколько типов
- •Атрибуты и ассоциации
- •Обобщение
- •Реализация
- •Uml. Диаграмма последовательности. Привести пример.
- •Создание схемы последовательностей
- •Изменение порядка сообщений
- •Перемещение или копирование последовательностей сообщений на схеме последовательностей
- •Оптимизация размещения элементов на схеме последовательностей
- •Изменить пакет, владеющий взаимодействием
- •Типы сообщений
- •Создание заметок о взаимодействиях
- •Инициирующее событие
- •Уровень детализации
- •Uml. Диаграмма деятельности. Привести пример. Простые потоки управления
- •Параллельные потоки
- •Потоки данных
- •Основные этапы создания схем активности
- •Uml. Диаграмма кооперации. Привести пример.
- •Uml. Диаграмма состояний. Привести пример.
- •Понятие состояния объекта
- •Переход
- •Сложные переходы
- •Переходы между параллельными состояниями
- •Переходы между составными состояниями
- •Синхронизирующие состояния
- •Uml. Диаграмма компонентов. Диаграмма развертывания. Привести пример.
- •Структурный паттерн проектирования «Компоновщик». Привести пример.
- •Структурный паттерн проектирования «Оболочка». Привести пример.
- •Структурный паттерн проектирования «Мост». Привести пример.
- •Структурный паттерн проектирования «Адаптер». Привести пример.
- •Структурный паттерн проектирования «Заместитель». Привести пример.
- •Структурный паттерн проектирования «Приспособленец». Привести пример.
- •Поведенческий паттерн проектирования «Команда». Привести пример.
- •Поведенческий паттерн проектирования «Наблюдатель». Привести пример.
- •Поведенческий паттерн проектирования «Состояние». Привести пример.
- •Поведенческий паттерн проектирования «Итератор». Привести пример.
- •Поведенческий паттерн проектирования «Цепочка обязанностей». Привести пример.
- •Поведенческий паттерн проектирования «Шаблонный метод». Привести пример.
- •Порождающий паттерн проектирования «Абстрактная фабрика». Привести пример.
- •Порождающий паттерн проектирования «Абстрактный метод». Привести пример.
- •Порождающий паттерн проектирования «Одиночка». Привести пример.
- •Порождающий паттерн проектирования «Прототип». Привести пример.
- •Порождающий паттерн проектирования «Строитель». Привести пример
- •Архитектурный шаблон проектирование mvc. Привести пример. Введение
- •«Оригинальный» mvc
- •Model (Модель)
- •View (Представление)
- •Controller (Контроллер)
- •Недостатки mvc и Document-View
- •Почему интерфейс?
- •Отличия от mvc
- •Заключение
Раскрыть смысл следующих понятий: «наследование», «инкапсуляция», «полиморфизм». Привести примеры кода на одном из объектно-ориентированных языков C++,JavaилиC#.
Все основанные на объектах языки (С#, Java, С++, Smalltalk, Visual Basic и т.п.) должны отвечать трем основным принципам объектно-ориентированного программирования (ООП), которые перечислены ниже:
Инкапсуляция
Как данный язык скрывает детали внутренней реализации объектов и предохраняет целостность данных?
Наследование
Как данный язык стимулирует многократное использование кода?
Полиморфизм
Как данный язык позволяет трактовать связанные объекты сходным образом?
Прежде чем погрузиться в синтаксические детали реализации каждого принципа, важно понять базовую роль каждого из них.
Роль инкапсуляции
Инкапсуляция — это механизм программирования, объединяющий вместе код и данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных. В объектно-ориентированном языке данные и код могут быть объединены в совершенно автономный черный ящик. Внутри такого ящика находятся все необходимые данные и код. Когда код и данные связываются вместе подобным образом, создается объект. Иными словами, объект — это элемент, поддерживающий инкапсуляцию.
Т.е. инкапсуляция представляет собой способности языка скрывать излишние детали реализации от пользователя объекта. Например, предположим, что используется класс по имени DatabaseReader, который имеет два главных метода: Ореn() и Close().
Фиктивный класс DatabaseReader инкапсулирует внутренние детали нахождения, загрузки, манипуляций и закрытия файла данных. Программистам нравится инкапсуляция, поскольку этот принцип ООП упрощает кодирование. Нет необходимости беспокоиться о многочисленных строках кода, которые работают "за кулисами", чтобы реализовать функционирование класса DatabaseReader. Все, что потребуется — это создать экземпляр и отправлять ему соответствующие сообщения (например, "открыть файл по имени AutoLot.mdf, расположенный на диске С:").
С идеей инкапсуляции программной логики тесно связана идея защиты данных. В идеале данные состояния объекта должны быть специфицированы с использованием ключевого слова private (или, возможно, protected). Таким образом, внешний мир должен вежливо попросить, если захочет изменить или получить лежащее в основе значение. Это хороший принцип, поскольку общедоступные элементы данных можно легко повредить (даже нечаянно, а не преднамеренно).
Основной единицей инкапсуляции в С# является класс, который определяет форму объекта. Он описывает данные, а также код, который будет ими оперировать. В С# описание класса служит для построения объектов, которые являются экземплярами класса. Следовательно, класс, по существу, представляет собой ряд схематических описаний способа построения объекта.
Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующий данными, содержится в функциях-членах, самым типичным представителем которых является метод. В С# метод служит в качестве аналога подпрограммы. (К числу других функций-членов относятся свойства, события и конструкторы.) Таким образом, методы класса содержат код, воздействующий на поля, определяемые этим классом.
Роль наследования
Следующий принцип ООП — наследование — касается способности языка позволять строить новые определения классов на основе определений существующих классов. По сути, наследование позволяет расширять поведение базового (или родительского) класса, наследуя основную функциональность в производном подклассе (также именуемом дочерним классом):
Т.е. наследование представляет собой процесс, в ходе которого один объект приобретает свойства другого объекта. Это очень важный процесс, поскольку он обеспечивает принцип иерархической классификации. Если вдуматься, то большая часть знаний поддается систематизации благодаря иерархической классификации по нисходящей.
Если не пользоваться иерархиями, то для каждого объекта пришлось бы явно определять все его свойства. А если воспользоваться наследованием, то достаточно определить лишь те свойства, которые делают объект особенным в его классе. Он может также наследовать общие свойства своего родителя. Следовательно, благодаря механизму наследования один объект становится отдельным экземпляром более общего класса.
Множественное наследование
При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML. Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя. Попытка решения проблемы наличия одинаковых имен методов в предках была предпринята в языке Эйфель, в котором при описании нового класса необходимо явно указывать импортируемые члены каждого из наследуемых классов и их именование в дочернем классе. Большинство современных объектно-ориентированных языков программирования (C#, Java, Delphi и др.) поддерживают возможность одновременно наследоваться от класса-предка и реализовать методы нескольких интерфейсов одним и тем же классом. Этот механизм позволяет во многом заменить множественное наследование — методы интерфейсов необходимо переопределять явно, что исключает ошибки при наследовании функциональности одинаковых методов различных классов-предков.