Скачать презентацию Занятие 10 Курс Основы программирования План занятия Скачать презентацию Занятие 10 Курс Основы программирования План занятия

10 Объектно-ориентированное программирование.pptx

  • Количество слайдов: 25

Занятие 10 Курс Занятие 10 Курс "Основы программирования"

План занятия 1. Что такое ООП? 2. Основные принципы ООП 3. Классы в С++ План занятия 1. Что такое ООП? 2. Основные принципы ООП 3. Классы в С++ 4. Объекты в JS 5. Паттерны ООП

Что такое ООП? • Парадигма, в которой основными концепциями являются понятия объектов и классов. Что такое ООП? • Парадигма, в которой основными концепциями являются понятия объектов и классов. • В случае языков с прототипированием вместо классов используются объектыпрототипы.

Для чего это нужно • Структурирование программ • Обеспечение типовых процессов Например, программа, где Для чего это нужно • Структурирование программ • Обеспечение типовых процессов Например, программа, где по окну летает 1 мяч легко может быть написана без ООП, но что если мячей 100, и все они летают по единому правилу?

1 мяч var x = 0, y = vx = 1, vy 0; = 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 мячей? • Каждый мяч имеет отдельную позицию. • Каждый мяч летит в своём направлении. • Каждый мяч отдельно обрабатывается.

100 мячей function Ball(_x, _y) { var x = _x, y = _y; var 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. Полиморфизм Основные принципы ООП 1. Инкапсуляция 2. Наследование 3. Полиморфизм

Инкапсуляция • Все свойства объекта содержатся в самом объекте. • Объект – чёрный ящик, Инкапсуляция • Все свойства объекта содержатся в самом объекте. • Объект – чёрный ящик, с ограниченным списком действий и свойств. • Внутренние процессы объекта недоступны стороннему наблюдателю.

Наследование • Механизм, позволяющий описать новый класс на основе уже существующего. • Новый класс Наследование • Механизм, позволяющий описать новый класс на основе уже существующего. • Новый класс расширяет и уточняет возможности предыдущего.

Полиморфизм • Несколько сущностей используют идентичный интерфейс, определённый в базовом классе. • Мы можем Полиморфизм • Несколько сущностей используют идентичный интерфейс, определённый в базовом классе. • Мы можем не знать конкретный класс объекта, а лишь знать о том какой интерфейс он наследует, чтобы работать с ним.

Классы в С++ • Создать класс – значит создать новый тип данных. • Далее Классы в С++ • Создать класс – значит создать новый тип данных. • Далее можно будет создавать переменные такого типа. • Класс состоит из полей и методов – переменных и функций.

Создание класса class ИМЯ { /* поля и методы */ }; Имя класса выбирается Создание класса class ИМЯ { /* поля и методы */ }; Имя класса выбирается по тем же правилам, что и имена переменных. В конце описания класса ставится « ; »

Поля и методы class C { int x; // Поле. Нельзя написать сразу «=» Поля и методы class C { int x; // Поле. Нельзя написать сразу «=» float f(int a) { return 0. f; } // Метод }; Место где объявляются поля и методы – не является последовательностью КОМАНД, это всего лишь описание. Поэтому нельзя «=» .

Права доступа, инкапсуляция class C { public: // Доступно снаружи int get. X() { Права доступа, инкапсуляция class C { public: // Доступно снаружи int get. X() { return x / 2; } private: // Доступно только классу int x; };

Наследование классов class А { public: int x; }; class B : public A Наследование классов 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 : Полиморфизм 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 : Полиморфизм 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 хорошо приспособлен для работы с объектами, но парадигма несколько отличается Объекты в JS JS хорошо приспособлен для работы с объектами, но парадигма несколько отличается от С++. Понятие «Класс» , данный язык не предлагает. Оно и не нужно здесь. Есть два способа создания объектов: 1. Использование объектного литерала x = { }. 2. Использование оператора new с вызовом функции.

Объектные литералы В JS объекты записываются подобно массивам, но имена внутренних элементов должны быть Объектные литералы В JS объекты записываются подобно массивам, но имена внутренних элементов должны быть указаны: var a = { x: 0, y: 0 } Теперь a – это созданный нами ОБЪЕКТ. Им уже можно пользоваться: a. x = 42; Это может быть обёрнуто в функцию-КОНСТРУКТОР, вызывая которую много раз мы получим множество отдельных объектов.

Объектные литералы Чтобы получить многоразовый КОНСТРУКТОР, просто воспользуемся функцией! function Vec 2( ) { Объектные литералы Чтобы получить многоразовый КОНСТРУКТОР, просто воспользуемся функцией! function Vec 2( ) { return { x: 0, y: 0 }; } var a = Vec 2(); var b = Vec 2();

Оператор new Немного другой способ создания объектов: function Vec 2( ) { this. x Оператор 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 Нет private и public: есть только public – все свойства объекта доступны извне. Но JS гораздо гибче С++. function Vec 2( ) { var a = 0, b = 0; return { get x(){ return a; }, set y(n) { b = n; } }; }

Паттерны в ООП Википедия: Шаблон проектирования • Часто бывает что архитектурная суть решения повторяется Паттерны в ООП Википедия: Шаблон проектирования • Часто бывает что архитектурная суть решения повторяется от задачи к задаче. • Такой часто-повторяющийся способ решения становится паттерном. • В следующий раз встретив схожую задачу можно решить её гораздо быстрее, зная о паттерне.

ВАШИ ВОПРОСЫ Обязательно задавайте вопросы, даже если боитесь что за это вас засмеют или ВАШИ ВОПРОСЫ Обязательно задавайте вопросы, даже если боитесь что за это вас засмеют или «тут так не принято» . Кто ничего не спрашивает – тот бездельник. Хорошо поставленный вопрос – уже половина ответа.