- •1. Событийно-управляемое приложение: событие, типы событий, сообщение, обработчик, механизм обмена сообщениями, очередь сообщений.
- •3. Жизненный цикл объектов: создание, уничтожение, конструкторы, деструкторы. Автоматическое управление памятью. Утечка памяти. Создание объектов с помощью различных конструкторов.
- •4. Наследование, типы видимости, типы наследования. Композиция, агрегация, ассоциация, зависимость. Композиция или наследование, в чём отличие и в чём похожесть.
- •6. Полиморфизм: переопределение и перекрытие методов. Вызов унаследованных методов. Варианты реализации в разных языках. Виртуальный деструктор.
- •7. Приведение типов. Правила, цель, стандартные приемы. Самостоятельная реализация, варианты реализации в разных языках.
- •8.Grasp-паттерны: информационный эксперт, низкая связность, высокое зацепление. Антипаттерны.
- •Золотой молоток (Golden hammer)
- •9. Бесклассовое (прототипно-ориентированное) ооп
- •10. Множественное наследование, интерфейсы и примеси (mixins).
- •11. Делегирование, объектная шизофрения.
- •13. Solid – принципы: sol.
- •14. Solid – принципы: id.
- •15. Объектная интроспекция и рефлексия.
- •16. Язык uml (диаграммы классов, состояний, последовательностей).
- •17. Архитектура Model–View–Controller (mvc) и её варианты. Самый простой способ её нарушить и исправить.
- •17. Одинарная и двойная диспетчеризация.
- •17. Покажите, как с помощью паттерна Prototype можно создавать копии любых объектов, не зная о конкретном классе каждого объекта.
- •18. Требуется создать такой класс, для которого в приложении не может существовать больше одного экземпляра. Опишите ситуацию, в которой это может потребоваться и решение с помощью паттерна Singleton
- •20. Покажите, как с помощью паттерна Decorator динамически (во время выполнения программы) видоизменять поведение объектов.
- •22. Инкапсулируйте любое действие в программе в отдельный объект, и покажите, как паттерн Command позволяет при этом манипулировать такими объектами и реализовывать отмену действий.
- •25. Покажите, как с помощью паттерна Observer можно реализовать динамическую (в момент работы программы) подписку одних объектов на уведомления об изменении других объектов.
- •26. Покажите, как с помощью паттерна Strategy реализуются различные варианты реализации одной и той же функциональности объекта.
- •30. Требуется в имеющейся функциональной иерархии объектов динамически изменять внутреннюю реализацию любого объекта. Покажите, как это может быть сделано с помощью паттерна Bridge.
- •31. Покажите, каким образом с помощью паттерна Visitor можно добавить новую функциональность целой иерархии потомков одного базового класса, не изменив ни одного класса этой иерархии.
10. Множественное наследование, интерфейсы и примеси (mixins).
Множественное наследование — объявление потомка от двух и более классов. При множественном наследовании потомок наследует все методы и свойства своих предков.
При множественном наследовании возникают различные проблемы, в частности, проблема ромба. Ситуация возникает, когда классы Б и С наследуются от класса А, а класс Д от классов Б и С. Пусть класс А содержит некий метод, классы Б и С по-своему переопределяют. От какого класса должен наследовать метод класс Д: Б или С? Каждый язык решает проблему по-своему. Мы можем решить эту проблему заменим наследование композицией. Интерфейсы позволяют решить проблему ромба при множественном наследовании, т.к. класс всегда будет иметь ровно одну реализацию каждого метода.
Интерфейс: в программном смысле — это набор методов, с помощью которых можно взаимодействовать с объектом. Чтобы сказать, что класс поддерживает (реализует) данный интерфейс, нужно, чтобы класс реализовывал все методы, перечисленные в интерфейсе.
Использование интерфейсов — один из вариантов обеспечения полиморфизма. Все классы с одинаковым интерфейсом внешне ведут себя одинаково, что позволяет писать обобщенный код. Это ограничивает нас в использовании объектов, но позволяет легко подменять одни объекты, реализующие интерфейс, на другие объекты, реализующие тот же интерфейс.
В C++ интерфейс представляет собой абстрактный класс, у которого каждый метод виртуальный и абстрактный и не имеет полей.
Интерфейс — это средство:
● документирования требований к программе;
● отделение реализации от абстракции (интерфейс меняется редко, реализация — часто);
● ограничение и регламентирование доступа к методам объекта
Примесь (mixin) — элемент ЯП (обычно класс или модуль), реализующий какое-либо четко выделенное поведение. Используется для уточнения поведения других классов, но не для порождения самостоятельно используемых объектов. Примеси повышают повторную используемость кода, избегая проблем множественного наследования, но со своими ограничениями.
Примеси поддерживают языки D, Python, Ruby и другие. Близкую к примесям функциональность предоставляют интерфейсы в Java и C#. C++ не поддерживает примеси, но их концепция реализуема через другие механизмы языка.
11. Делегирование, объектная шизофрения.
Делегирование — ситуация, при которой объект вместо того, чтобы самостоятельно выполнять некоторую функциональность, перекладывает эту обязанность на другой объект (делегат), самостоятельно вызывая эту функциональность у другого объекта или используя встроенные средства языка.
Например: Class A { void foo() {...} } Class B { Private A a; B() { a = new A(); } void bar() { a.foo() } } Объектная шизофрения — термин, используемый при делегировании для описания ситуаций, при которых в методе делегата есть указатель одновременно и на объект делегата, и на объект, делегирующий полномочия. При этом не всегда понятно, в контексте какого из объектов нужно выполнять метод.
Мы говорим: «один объект делегирует другому объекту какую-то задачу», но откуда он узнает, кому другому? Чаще всего а таких случаях, как показано в коде выше, используется агрегация, и делегирующий делегирует задачу тому объекту, ссылку на которого он получил когда-то и хранит.
Например, когда в классе формы находится обработчик кнопки. Непонятно, в контексте какого объекта трактовать width и другие подобные свойства.
12.Одинарная и двойная диспетчеризация.
Диспетчеризация - ситуация, когда в коде написан вызов какого-то метода, а компилятору нужно решить, на какую ветку кода отправить процессор выполнять инструкции.
Одинарная (динамическая) диспетчеризация — это простой обычный полиморфизм.
void foo (CShape *s) {
s−>move (); }
Двойная диспетчеризация — это такая диспетчеризация, которая выполняется по двум признакам и оба признака могут быть неизвестны до момента выполнения программы.
void foo (CShape *s, string method) {
s−>method (); }
