- •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 можно добавить новую функциональность целой иерархии потомков одного базового класса, не изменив ни одного класса этой иерархии.
25. Покажите, как с помощью паттерна Observer можно реализовать динамическую (в момент работы программы) подписку одних объектов на уведомления об изменении других объектов.
Наблюдатель — это поведенческий паттерн проектирования, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
class Subject;
class Observer{ public: virtual void onSubjectChanged(Subject *who) = NULL;};
class Subject{ private: vector<Observer*> *_observers; public : Subject(){ _observers = new vector<Observers*>;} void AddObserver (Observer* o){ _observers->push_back(o);} void notifyEveryOne(){ vector<Observer*>::iterator I; for (I = _observers->begin(); i!= observers->end(); i++) (*i)->onSubjectChanged(this);
class Animal : public Subject{ public: char *lastsound, *name; Animal(char *aname) {name = aname; lastsound = “”;} void say(shar* sound){ lastsound = sound; cout << sound; notifyEveryOne();}};
class Child : public Observer{ public: char *name; Child(char * cname) {name = cname;} void onSubjectChanged(Subject * who) { cout << “Child” + name + “say” + who->name + “says” + who->lastSound;}};
26. Покажите, как с помощью паттерна Strategy реализуются различные варианты реализации одной и той же функциональности объекта.
Стратегия — это поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
class Strategy{ public: virtual int execute(int x) = NULL;};
class Context{ private: Strategy * _strategy; public: Contex(){ _strategy = NULL;}; void setStraregy(Strategy * strategy){ delete this->_strategy; _strategy = strategy;}; void doSomething(int _x){ cout << _strategy->execute(x);}};
class StrategyInc : public Strategy{ public: int execute(int x){ return x+1;}};
class StrategyQrt : public Strategy{ public: int execute(int x){ return x*x;}};
int main(){ Strategy * inc = new StrategyInc(); Strategy * qrt = new StrategyQrt(); Context * context = new Context(); context->setStrategy(inc); context->doSomething(5); //Output: 6 context->setStrategy(qrt); context->doSomething(5); //Ouput: 25}
27. Метод FOO() у класса A выполняет действия D1, D2, DX и D4 именно в таком порядке. Метод FOO() у класса B выполняет действия D1, D2, DY и D4 именно в таком порядке. Покажите, как можно избавиться от дублирования кода с помощью паттерна Template Method.
Шаблонный метод — это поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
class TemplateClass{ public : void TemplateMethod{ D1(); D2(); DD(); D4();} void DD() = NULL;};
class A : public TemplateClass{ public : void DD() { DX();}};
class B : public TemplateClass{ public : void DD() {DX();}};
int Main(){ A * a = new A(); B * b = new B(); a.TemplateMethod(); //D1, D2, DX, D4 b.TemplateMethod(); //D1, D2, Dy, D4
28. Имеется объект класса X, реализующий интерфейс IX. Имеется программа, которая умеет пользоваться методами интерфейса IY. Покажите, как с помощью паттерна Adapter можно научить программу пользоваться объектом класса X.
Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Есть два варианта. В первом мы публично наследуемся от интерфейса, с которым хоть работать, и приватно от класса, который хотим адаптировать под интерфейс. Во втором мы не наследуемся приватно, а агрегируем класс.
29. Имеется набор объектов, каждый из которых может обрабатывать запросы. Покажите, как с помощью паттерна Chain of Responsibility позволить программе отправлять запрос на обработку, не зная, какой конкретно объект этот запрос обработает.
Цепочка обязанностей — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи.
class Handler{ public : virtual void HandleRequest() = NULL;};
class ConcreteHandler : public Handler{ private: int value; Handler *next; public: ConcreateHandler(int val, Handler * nex) bool HandleRequest(int val){ if (val == value) return true; else if (next!=NULL) return next->HandleRequest();}}; else cout << “Final”; return true;
int main(){ Handler* hand = new Concreatehandler(5, NULL); ;
