10 Объектно-ориентированное программирование.pptx
- Количество слайдов: 25
Занятие 10 Курс "Основы программирования"
План занятия 1. Что такое ООП? 2. Основные принципы ООП 3. Классы в С++ 4. Объекты в JS 5. Паттерны ООП
Что такое ООП? • Парадигма, в которой основными концепциями являются понятия объектов и классов. • В случае языков с прототипированием вместо классов используются объектыпрототипы.
Для чего это нужно • Структурирование программ • Обеспечение типовых процессов Например, программа, где по окну летает 1 мяч легко может быть написана без ООП, но что если мячей 100, и все они летают по единому правилу?
1 мяч var x = 0, y = vx = 1, vy 0; = 1; set. Interval( function () { if if (x (y }, 20); < < > > 0) 0) 100) { { x y = = 0; 0; 100; vx vy = = Math. abs(vx); Math. abs(vy); -Math. abs(vx); -Math. abs(vy); } }
100 мячей? • Каждый мяч имеет отдельную позицию. • Каждый мяч летит в своём направлении. • Каждый мяч отдельно обрабатывается.
100 мячей function Ball(_x, _y) { var x = _x, y = _y; var vx = 1, vy = 1; function tick () { if if (x (y < < > > 0) 0) 100) { { x y = = 0; 0; 100; vx vy = Math. abs(vx); } = Math. abs(vy); } = -Math. abs(vx); } = -Math. abs(vy); } } return { tick: tick }; } var balls = []; for(var i=0; i<100; i++; ) balls. push(Ball(i, i)); set. Interval( function (){ balls. for. Each(function(b){b. tick()}); }, 20);
Основные принципы ООП 1. Инкапсуляция 2. Наследование 3. Полиморфизм
Инкапсуляция • Все свойства объекта содержатся в самом объекте. • Объект – чёрный ящик, с ограниченным списком действий и свойств. • Внутренние процессы объекта недоступны стороннему наблюдателю.
Наследование • Механизм, позволяющий описать новый класс на основе уже существующего. • Новый класс расширяет и уточняет возможности предыдущего.
Полиморфизм • Несколько сущностей используют идентичный интерфейс, определённый в базовом классе. • Мы можем не знать конкретный класс объекта, а лишь знать о том какой интерфейс он наследует, чтобы работать с ним.
Классы в С++ • Создать класс – значит создать новый тип данных. • Далее можно будет создавать переменные такого типа. • Класс состоит из полей и методов – переменных и функций.
Создание класса class ИМЯ { /* поля и методы */ }; Имя класса выбирается по тем же правилам, что и имена переменных. В конце описания класса ставится « ; »
Поля и методы class C { int x; // Поле. Нельзя написать сразу «=» float f(int a) { return 0. f; } // Метод }; Место где объявляются поля и методы – не является последовательностью КОМАНД, это всего лишь описание. Поэтому нельзя «=» .
Права доступа, инкапсуляция class C { public: // Доступно снаружи int get. X() { return x / 2; } private: // Доступно только классу int x; };
Наследование классов class А { public: int x; }; class B : public A { public: int y; }; class C : public A { public: int z; }; class D : public B { public: int z; }; В классе А есть только поле x, в классе B доступны как x так и y, а в классе С доступны x и z. В классе D присутствуют x и y из класса B и собственный z.
Полиморфизм class А { public: virtual int f() = 0; }; class B : public A { public: int f(){return 1; } }; class C : public A { public: int f(){return 2; } }; class D : public A { public: int x; }; Класс А задаёт интерфейс: в нём не описано как именно работает f( ). В классе B этот метод реализован так, что возвращает всегда 1, а в С иначе: возвращает всегда 2. Особенность классов A и D в том, что объекты такого типа создать нельзя, так как они содержат НЕОПРЕДЕЛЁННУЮ f( ).
Полиморфизм class А { public: virtual int f() = 0; }; class B : public A { public: int f(){return 1; } }; class C : public A { public: int f(){return 2; } }; class D : public A { public: int x; }; A *objects[] = { new B, new C }; for(int i = 0; i < 2; i++) printf( “%i”, objects[i]. f() ); // Вызовутся B: : f() и C: : f(), хотя работаем с A*
Объекты в JS JS хорошо приспособлен для работы с объектами, но парадигма несколько отличается от С++. Понятие «Класс» , данный язык не предлагает. Оно и не нужно здесь. Есть два способа создания объектов: 1. Использование объектного литерала x = { }. 2. Использование оператора new с вызовом функции.
Объектные литералы В JS объекты записываются подобно массивам, но имена внутренних элементов должны быть указаны: var a = { x: 0, y: 0 } Теперь a – это созданный нами ОБЪЕКТ. Им уже можно пользоваться: a. x = 42; Это может быть обёрнуто в функцию-КОНСТРУКТОР, вызывая которую много раз мы получим множество отдельных объектов.
Объектные литералы Чтобы получить многоразовый КОНСТРУКТОР, просто воспользуемся функцией! function Vec 2( ) { return { x: 0, y: 0 }; } var a = Vec 2(); var b = Vec 2();
Оператор new Немного другой способ создания объектов: function Vec 2( ) { this. x = 0; this. y = 0; } var a = new Vec 2(); var b = new Vec 2;
Права доступа в JS Нет private и public: есть только public – все свойства объекта доступны извне. Но JS гораздо гибче С++. function Vec 2( ) { var a = 0, b = 0; return { get x(){ return a; }, set y(n) { b = n; } }; }
Паттерны в ООП Википедия: Шаблон проектирования • Часто бывает что архитектурная суть решения повторяется от задачи к задаче. • Такой часто-повторяющийся способ решения становится паттерном. • В следующий раз встретив схожую задачу можно решить её гораздо быстрее, зная о паттерне.
ВАШИ ВОПРОСЫ Обязательно задавайте вопросы, даже если боитесь что за это вас засмеют или «тут так не принято» . Кто ничего не спрашивает – тот бездельник. Хорошо поставленный вопрос – уже половина ответа.


