SlideShare a Scribd company logo
1 of 31
д.т.н. Емельянов Виталий Александрович
: v.yemelyanov@gmail.com
1
Getting StartedObject-Oriented
Programming
2
Тенденции разработки ПО
 переход от расчетов по формулам к сложным задачам
моделирования систем;
 увеличение объемов обрабатываемых данных;
 повышение сложности программ, увеличение их длины (до
миллионов строк кода!).
Сложность программ превышает возможности одного
человека (программиста).
!
В итоге:
 коллективная разработка
 каждый делает свою часть независимо от других
 части программы легко «собрать» вместе
Как?
?
Емельянов В.А.: Объектно-ориентированное программирование
3
Тенденции разработки ПО
подзадача 1 подзадача 3
подзадача 2.1 подзадача 2.2 подзадача 2.3
подзадача 2
задача
Алгоритмическая
декомпозиция
Структурное и процедурное программирование:
ПРОБЛЕМА: «Люди воспринимают мир, состоящий из
объектов» (Р. Декарт).
Емельянов В.А.: Объектно-ориентированное программирование
4
Объектно-ориентированное
программирование
Что понимает компьютер
Как человеку проще
записывать действия
Как человеку проще
мыслить
Ассемблер (машинный код)
Процедурное программирование
Парадигмы программирования
Емельянов В.А.: Объектно-ориентированное программирование
5
ООП – это парадигма программирования, в которой базовым
является понятие объекта.
Объект в программе – это абстракция реального объекта
Абстракция – это выделение существенных свойств объекта,
отличающих его от других объектов
Объектно-ориентированное
программирование (ООП)
Емельянов В.А.: Объектно-ориентированное программирование
Программа в ходе работы
представляет собой набор
взаимодействующих объектов
6
behavior
state
Object
Нажать
на газ
Нажать на
тормоз Заправить
топливом
Марка Скорость
Уровень
бензина
Понятие объекта
Емельянов В.А.: Объектно-ориентированное программирование
7
Понятие класса
 Класс (class) описывает признаки состояния и поведение
множества схожих объектов.
 Класс – это пользовательский тип данных
auto1
auto2
auto3
Car
objects class
Класс
Поля Методы
состояние
(state)
поведение
(behavior)
Емельянов В.А.: Объектно-ориентированное программирование
8
Создание класса
C#
Емельянов В.А.: Объектно-ориентированное программирование
Доступность
элементов
Модификатор:
Class
(базовый
класс)
Subclass
(класс-
наследник)
World
public Да Да Да
protected Да Да Нет
private Да Нет Нет
Класс на С# описывается следующим образом:
[модификаторы] class имя_класса [ : предки]
{
//тело класса (поля и методы)
}
9
Создание класса
UML C#
Product
+Price:float
+Amount:float
-pID:Integer
+Calc(Count:integer)
class Product
{
//открытые данные класса
public float Price;
public float Amount;
//внутренние закрытые данные класса
private int pID;
//метод для расчета общей стоимости
public void Calc(int count)
{
Amount = Price * count;
}
}
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
10
Создание объекта класса
(экземпляра класса)
 Объекты (экземпляры классов) создаются с помощью
оператора new.
 Для получения доступа к данным объекта или для вызова
методов, используется оператор точка «.»
 При создании объекта, копия данных, описываемых классом
записывается в память и присваивается переменной
ссылочного типа.
имя_Класса имя_ссылки; //объявление ссылки
имя_ссылки = new имя_Класса(); //создание объекта класса
имя_ссылки.имяПоля = 0; //обращение к полю
имя_ссылки.имяМетода(); //вызов метода
C#
Емельянов В.А.: Объектно-ориентированное программирование
11
Создание объекта класса
(экземпляра класса)
C#
static void Main(string[] args)
{
int number=0;
Product orderedProduct = new Product(); /* создание объекта с именем
orderedProduct класса Product*/
orderedProduct.Price = 10; /* обращение к полю Price
и задание цены за единицу товара=10 */
Console.WriteLine("Введите количество товара в шт.: ");
number = Convert.ToInt32(Console.ReadLine());
orderedProduct.Calc(number); /* вызов метода Calc() класса Product и
передача параметра number */
Console.WriteLine("Стоимость товара="+orderedProduct.Amount);
Console.ReadKey();
}
Емельянов В.А.: Объектно-ориентированное программирование
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
12
Конструктор
Конструктор – особый вид метода в классе
По смыслу:
Вызывается автоматически при каждом
создании объекта. Типовое применение:
установка полей в заданное значение
По синтаксису:
Имя должно совпадать с именем класса
Не имеет возвращаемого объекта
Должен иметь модификатор public
Емельянов В.А.: Объектно-ориентированное программирование
13
Конструктор
Особенности конструктора:
 Каждый класс имеет конструктор, принятый по умолчанию
 Конструктор по умолчанию не имеет параметров и устанавливает все
поля в значение по умолчанию в зависимости от их типа
 Программист может определить собственный конструктор. В этом
случае конструктор по умолчанию удаляется.
 Конструктор может иметь параметры.
Product orderedProduct = new Product();
//Price= 0 Amount= 0 prID= 0
//Description = пустая строка
C#
Имя класса Имя объекта Вызов конструктора
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
14
Конструктор
class Product
{
public float Price;
public float Amount;
private int pID;
// Конструктор
public Product(int ID)
{
pID = ID;
if (pID == 1111)
Price = 10;
else
Price = 20;
}
public void Calc(int count)
{
Amount = Price * count;
}
}
C#
Конструктор с параметром,
созданный программистом
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
15
Конструктор
static void Main(string[] args)
{
int number = 0;
Console.WriteLine("Введите артикул товара, который хотите заказать: ");
int vendorCode = Convert.ToInt32(Console.ReadLine());
Product orderedProduct = new Product(vendorCode);
Console.WriteLine("Введите количество товара в шт.: ");
number = Convert.ToInt32(Console.ReadLine());
orderedProduct.Calc(number);
Console.WriteLine("Стоимость товара = " + orderedProduct.Amount);
Console.ReadKey();
}
C#
Вызов конструктора
Емельянов В.А.: Объектно-ориентированное программирование
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
16
Базовые принципы ООП
А
бстракция
И
нкапсуляция
Н
аследование
П
олим
орф
изм
Емельянов В.А.: Объектно-ориентированное программирование
17
Инкапсуляция – скрытие деталей внутреннего устройства класса
от внешних по отношению к нему объектов или классов.
 Поля закрываются от доступа извне
 Доступ к закрытым полям выполняется через открытые
методы, играющие роль интерфейса (интерфейсные методы)
Инкапсуляция
UML
Емельянов В.А.: Объектно-ориентированное программирование
18
Инкапсуляция
class Employee
{
//закрытые данные класса
private string FullName;
private int EmpID;
private float CurrPay;
//конструктор
public Employee(string FName, int EmployeeID, float CurrentPay)
{
FullName = FName;
EmpID = EmployeeID;
CurrPay = CurrentPay;
}
//метод для увеличения зарплаты работника
public void GiveBonus(float amount)
{
CurrPay = CurrPay + amount;
}
}
C#
Инкапсуляция
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
скрытые поля открытые интерфейсные методы
19
 борьба со сложностью
 безопасность внутренних данных
 возможность изменять «внутренности», не меняя
интерфейс
Зачем нужна инкапсуляция?
Емельянов В.А.: Объектно-ориентированное программирование
20
Наследование
Наследование (inheritance) – механизм создания новых
классов на основе существующих.
 При наследовании дочернему классу (subclass)
передаются поля и методы родительского класса
(superclass)
 У класса может быть один родитель и любое количество
дочерних классов
родительский
класс
дочерний
класс
Transport
Car Bicycle
Емельянов В.А.: Объектно-ориентированное программирование
21
Наследование
Наследование в разработке кода:
 Определение нового типа данных путем
указания отличий от ранее определенного
типа данных.
 Определяемый тип данных будет содержать
поля и методы предка (унаследованные поля
и методы) и поля и методы, определенные в
нем самом.
//Класс предок
class ClassA
{
//Поля
//Методы()
}
C#
//Класс потомок(наследник)
class ClassB : ClassA
{
//Дополнительные поля
//Дополнительные методы()
}
C#
Наследование в
проектировании:
UML
Емельянов В.А.: Объектно-ориентированное программирование
22
Наследование
Особенности наследования в C# (Java, PHP и др.):
 Класс предок может иметь несколько классов потомков
 Класс может иметь не более одного предка (множественное
наследование запрещено, в отличие от C++ и UML)
Класс предок Класс потомок 2Класс потомок 1
Класс потомок Класс предок 2Класс предок 1
Емельянов В.А.: Объектно-ориентированное программирование
23
Наследование
class Manager : Employee
{
//менеджерам необходимо знать кол-во
//имеющихся у них опционов на акции
private int numberOfOptions;
public void NumOptions(int count)
{
numberOfOptions = count;
}
}
class SalesPerson : Employee
{
//продавцам надо знать объем продаж
private int numberOfSales;
public void NumSales(int count)
{
numberOfSales = count;
}
}
C#
static void Main(string[] args)
{
//создаем объект продавец с именем Ivan:
SalesPerson Ivan = new SalesPerson();
//Этот член унаследован от
//базового класса Employee:
Ivan.GiveBonus(5000);
//А это уникальный член
//определенный в классе-наследнике:
Ivan.NumSales(80);
}
Объявление классов-наследников
Manager и SalesPerson:
Создание объекта
класса-наследника SalesPerson:
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
24
Полиморфизм
Полиморфизм (polymorphism) – реализация одной и той же
операции по разному
 имеется несколько реализаций алгоритма
 выбор реализации осуществляется в зависимости от типа
объекта и типа параметров
Механизмы реализации полиморфизма
Перегрузка (overloading)
методов и операций
Переопределение (overriding)
методов и операций
Емельянов В.А.: Объектно-ориентированное программирование
25
Полиморфизм: переопределение методов
(overriding)
Переопределим реакцию
объектов производных
классов на метод базового
класса (метод увеличения
зарплаты сотрудников):
UML
1. Метод базового класса, который будет переопределен должен быть
объявлен, как виртуальный (ключевое слово virtual):
class Employee
{
//метод для увеличения зарплаты работника
public virtual void GiveBonus(float amount)
{
CurrPay = CurrPay + amount;
}
}
C#
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
26
Полиморфизм: переопределение методов
(overriding)
2. Переопределяя виртуальный метод в классе-наследнике, необходимо
заново определить его, используя ключевое слово override:
class SalesPerson : Employee
{
public override void GiveBonus(float amount)
{
int SalesBonus = 0; //кратность надбавки
//надбавка зависит от объема продаж
if (numberOfSales >=0 && numberOfSales <=100)
SalesBonus = 2;
else
SalesBonus = 5;
base.GiveBonus(amount * SalesBonus);
}
}
C#
Емельянов В.А.: Объектно-ориентированное программирование
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
27
Полиморфизм: переопределение методов
(overriding)
class Manager : Employee
{
public int numOfSalesPerson = 10; //количество продавцов в подчинении
public override void GiveBonus(float amount)
{
base.GiveBonus(amount+amount*numOfSalesPerson*(float)0.1);
}
}
C#
static void Main(string[] args)
{
//Улучшенная система премирования
Manager Nick = new Manager(); //Создаем менеджера Nick
Nick.GiveBonus(5000);
SalesPerson Ivan = new SalesPerson(); //Создаем продавца Ivan
Ivan.GiveBonus(1000);
}
C#
Вызов переопределенных методов:
Переопределение метода GiveBonus() класса Manager:
Емельянов В.А.: Объектно-ориентированное программирование
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
28
Полиморфизм: перегрузка методов
(overloading)
В C# допускается совместное использование одного и того
же имени двумя или более методами одного и того же
класса, при условии, что их параметры объявляются по-
разному. В этом случае говорят, что методы перегружаются,
а сам процесс называется перегрузкой методов.
Условия перегрузки методов:
 разный тип передаваемых параметров
 разное количество передаваемых параметров
 комбинация первых двух случаев
Емельянов В.А.: Объектно-ориентированное программирование
29
Полиморфизм: перегрузка методов
(overloading)
class OverloadMethods
{
public int methodSum(int param1, int param2)
{
return param1 + param2;
}
public int methodSum(int param1, int param2, int param3)
{
return param1 + param2 + param3;
}
public double methodSum(double param1, double param2)
{
return param1 + param2;
}
}
C#
Разное количество и тип параметров
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Перегруженные
методы
30
Полиморфизм: перегрузка методов
(overloading)
class Employee
{
//закрытые данные класса
private string FullName;
private int EmpID;
private float CurrPay;
//метод для увеличения зарплаты работника
public void GiveBonus(float amount)
{
CurrPay = CurrPay + amount;
}
//метод увеличения зарплаты работника от объема продаж
public void GiveBonus(float amount, int sales)
{
CurrPay = CurrPay + amount*sales;
}
}
C#
Перегруженные методы
Емельянов В.А.: Объектно-ориентированное программирование
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Steve Jobs, 1994,
интервью журналу Rolling Stone:
 «Объекты – они как люди. Они живые вещи, у которых есть разум,
позволяющий им знать, как сделать ту или иную вещь, у них есть память.
Вы взаимодействуете с ними на очень высоком уровне абстракции, словно
с людьми.
 Например, я – ваш объект, занимающийся чисткой ваших вещей. Вы
можете дать мне грязную одежду и послание “доставь мои вещи в
прачечную”. Я знаю, где в Сан-Франциско лучшая прачечная, я говорю по-
английски и у меня есть деньги в кармане. Я выхожу, ловлю такси,
посещаю прачечную и возвращаюсь с вашими вещами и словами: “Вот,
ваша чистая одежда”.
 Вы не знаете, как я это сделал. Не знаете, где эта прачечная или вы
говорите по-французски, а может у вас нет денег, чтобы поймать такси.
Однако, я знал, как все это сделать, а вам – это знать необязательно. Вся
сложность процесса скрыта внутри меня, но наше с вами общение было
простым – в этом вся суть объектов. СЛОЖНОСТИ – ВНУТРИ, НО
ИНТЕРФЕЙС – ДОСТУПЕН КАЖДОМУ.»
Не могли бы вы в нескольких словах объяснить, что же такое
объектно-ориентированное программное обеспечение?
?

More Related Content

What's hot

Using single row functions to customize output
Using single row functions to customize outputUsing single row functions to customize output
Using single row functions to customize output
Syed Zaid Irshad
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
Mikhail Kurnosov
 

What's hot (20)

AngularJS Directives
AngularJS DirectivesAngularJS Directives
AngularJS Directives
 
POO Java Chapitre 3 Collections
POO Java Chapitre 3 CollectionsPOO Java Chapitre 3 Collections
POO Java Chapitre 3 Collections
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Pl/sql - interaction avec la base de données & structures de contrôle
Pl/sql  - interaction avec la base de données & structures de contrôlePl/sql  - interaction avec la base de données & structures de contrôle
Pl/sql - interaction avec la base de données & structures de contrôle
 
Java 8 - CJ
Java 8 - CJJava 8 - CJ
Java 8 - CJ
 
Using single row functions to customize output
Using single row functions to customize outputUsing single row functions to customize output
Using single row functions to customize output
 
Exception Handling
Exception HandlingException Handling
Exception Handling
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Poo en c++ les relations entre classes
Poo en c++ les relations entre classesPoo en c++ les relations entre classes
Poo en c++ les relations entre classes
 
JAVA OOP
JAVA OOPJAVA OOP
JAVA OOP
 
C++17 std::filesystem - Overview
C++17 std::filesystem - OverviewC++17 std::filesystem - Overview
C++17 std::filesystem - Overview
 
Bac 2022- NSI journée 1
Bac 2022- NSI journée 1Bac 2022- NSI journée 1
Bac 2022- NSI journée 1
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Machine learning ( Part 3 )
Machine learning ( Part 3 )Machine learning ( Part 3 )
Machine learning ( Part 3 )
 
Extraction Hiérarchique | Cours sql oracle
Extraction Hiérarchique | Cours sql oracleExtraction Hiérarchique | Cours sql oracle
Extraction Hiérarchique | Cours sql oracle
 
Java Foundations: Basic Syntax, Conditions, Loops
Java Foundations: Basic Syntax, Conditions, LoopsJava Foundations: Basic Syntax, Conditions, Loops
Java Foundations: Basic Syntax, Conditions, Loops
 
RxJS Operators - Real World Use Cases - AngularMix
RxJS Operators - Real World Use Cases - AngularMixRxJS Operators - Real World Use Cases - AngularMix
RxJS Operators - Real World Use Cases - AngularMix
 
Oracle - Program with PL/SQL - Lession 09
Oracle - Program with PL/SQL - Lession 09Oracle - Program with PL/SQL - Lession 09
Oracle - Program with PL/SQL - Lession 09
 
ANATOMIA JAVA
ANATOMIA JAVAANATOMIA JAVA
ANATOMIA JAVA
 

Similar to Лекция 1. Основы объектно-ориентированного программирования

Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
Technopark
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
Sergey Nemchinsky
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
metaform
 

Similar to Лекция 1. Основы объектно-ориентированного программирования (20)

лекция №1
лекция №1лекция №1
лекция №1
 
Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010
 
Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.Основы ооп на языке C#. Часть 2. базовый синтаксис.
Основы ооп на языке C#. Часть 2. базовый синтаксис.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
слайд питон БОН.pptx
слайд  питон  БОН.pptxслайд  питон  БОН.pptx
слайд питон БОН.pptx
 
1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Software Engineering Knowledge Matrix
Software Engineering Knowledge MatrixSoftware Engineering Knowledge Matrix
Software Engineering Knowledge Matrix
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программирование
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
C# vs C++
C# vs C++C# vs C++
C# vs C++
 
Lecture 11 1
Lecture 11 1Lecture 11 1
Lecture 11 1
 

More from Виталий Емельянов

More from Виталий Емельянов (6)

Лекция Google Cloud Platform
Лекция Google Cloud PlatformЛекция Google Cloud Platform
Лекция Google Cloud Platform
 
Лекция 1. Архитектура информационных систем
Лекция 1. Архитектура информационных системЛекция 1. Архитектура информационных систем
Лекция 1. Архитектура информационных систем
 
Лекция 4. UML (physical model)
Лекция 4. UML (physical model)Лекция 4. UML (physical model)
Лекция 4. UML (physical model)
 
Лекция 3. UML (dynamic logical model)
Лекция 3. UML (dynamic logical model)Лекция 3. UML (dynamic logical model)
Лекция 3. UML (dynamic logical model)
 
Лекция 2. UML (static logical model)
Лекция 2. UML (static logical model)Лекция 2. UML (static logical model)
Лекция 2. UML (static logical model)
 
Лекция 3. Связи между классами
Лекция 3. Связи между классамиЛекция 3. Связи между классами
Лекция 3. Связи между классами
 

Лекция 1. Основы объектно-ориентированного программирования

  • 1. д.т.н. Емельянов Виталий Александрович : v.yemelyanov@gmail.com 1 Getting StartedObject-Oriented Programming
  • 2. 2 Тенденции разработки ПО  переход от расчетов по формулам к сложным задачам моделирования систем;  увеличение объемов обрабатываемых данных;  повышение сложности программ, увеличение их длины (до миллионов строк кода!). Сложность программ превышает возможности одного человека (программиста). ! В итоге:  коллективная разработка  каждый делает свою часть независимо от других  части программы легко «собрать» вместе Как? ? Емельянов В.А.: Объектно-ориентированное программирование
  • 3. 3 Тенденции разработки ПО подзадача 1 подзадача 3 подзадача 2.1 подзадача 2.2 подзадача 2.3 подзадача 2 задача Алгоритмическая декомпозиция Структурное и процедурное программирование: ПРОБЛЕМА: «Люди воспринимают мир, состоящий из объектов» (Р. Декарт). Емельянов В.А.: Объектно-ориентированное программирование
  • 4. 4 Объектно-ориентированное программирование Что понимает компьютер Как человеку проще записывать действия Как человеку проще мыслить Ассемблер (машинный код) Процедурное программирование Парадигмы программирования Емельянов В.А.: Объектно-ориентированное программирование
  • 5. 5 ООП – это парадигма программирования, в которой базовым является понятие объекта. Объект в программе – это абстракция реального объекта Абстракция – это выделение существенных свойств объекта, отличающих его от других объектов Объектно-ориентированное программирование (ООП) Емельянов В.А.: Объектно-ориентированное программирование Программа в ходе работы представляет собой набор взаимодействующих объектов
  • 6. 6 behavior state Object Нажать на газ Нажать на тормоз Заправить топливом Марка Скорость Уровень бензина Понятие объекта Емельянов В.А.: Объектно-ориентированное программирование
  • 7. 7 Понятие класса  Класс (class) описывает признаки состояния и поведение множества схожих объектов.  Класс – это пользовательский тип данных auto1 auto2 auto3 Car objects class Класс Поля Методы состояние (state) поведение (behavior) Емельянов В.А.: Объектно-ориентированное программирование
  • 8. 8 Создание класса C# Емельянов В.А.: Объектно-ориентированное программирование Доступность элементов Модификатор: Class (базовый класс) Subclass (класс- наследник) World public Да Да Да protected Да Да Нет private Да Нет Нет Класс на С# описывается следующим образом: [модификаторы] class имя_класса [ : предки] { //тело класса (поля и методы) }
  • 9. 9 Создание класса UML C# Product +Price:float +Amount:float -pID:Integer +Calc(Count:integer) class Product { //открытые данные класса public float Price; public float Amount; //внутренние закрытые данные класса private int pID; //метод для расчета общей стоимости public void Calc(int count) { Amount = Price * count; } } Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  • 10. 10 Создание объекта класса (экземпляра класса)  Объекты (экземпляры классов) создаются с помощью оператора new.  Для получения доступа к данным объекта или для вызова методов, используется оператор точка «.»  При создании объекта, копия данных, описываемых классом записывается в память и присваивается переменной ссылочного типа. имя_Класса имя_ссылки; //объявление ссылки имя_ссылки = new имя_Класса(); //создание объекта класса имя_ссылки.имяПоля = 0; //обращение к полю имя_ссылки.имяМетода(); //вызов метода C# Емельянов В.А.: Объектно-ориентированное программирование
  • 11. 11 Создание объекта класса (экземпляра класса) C# static void Main(string[] args) { int number=0; Product orderedProduct = new Product(); /* создание объекта с именем orderedProduct класса Product*/ orderedProduct.Price = 10; /* обращение к полю Price и задание цены за единицу товара=10 */ Console.WriteLine("Введите количество товара в шт.: "); number = Convert.ToInt32(Console.ReadLine()); orderedProduct.Calc(number); /* вызов метода Calc() класса Product и передача параметра number */ Console.WriteLine("Стоимость товара="+orderedProduct.Amount); Console.ReadKey(); } Емельянов В.А.: Объектно-ориентированное программирование 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
  • 12. 12 Конструктор Конструктор – особый вид метода в классе По смыслу: Вызывается автоматически при каждом создании объекта. Типовое применение: установка полей в заданное значение По синтаксису: Имя должно совпадать с именем класса Не имеет возвращаемого объекта Должен иметь модификатор public Емельянов В.А.: Объектно-ориентированное программирование
  • 13. 13 Конструктор Особенности конструктора:  Каждый класс имеет конструктор, принятый по умолчанию  Конструктор по умолчанию не имеет параметров и устанавливает все поля в значение по умолчанию в зависимости от их типа  Программист может определить собственный конструктор. В этом случае конструктор по умолчанию удаляется.  Конструктор может иметь параметры. Product orderedProduct = new Product(); //Price= 0 Amount= 0 prID= 0 //Description = пустая строка C# Имя класса Имя объекта Вызов конструктора Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6
  • 14. 14 Конструктор class Product { public float Price; public float Amount; private int pID; // Конструктор public Product(int ID) { pID = ID; if (pID == 1111) Price = 10; else Price = 20; } public void Calc(int count) { Amount = Price * count; } } C# Конструктор с параметром, созданный программистом Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
  • 15. 15 Конструктор static void Main(string[] args) { int number = 0; Console.WriteLine("Введите артикул товара, который хотите заказать: "); int vendorCode = Convert.ToInt32(Console.ReadLine()); Product orderedProduct = new Product(vendorCode); Console.WriteLine("Введите количество товара в шт.: "); number = Convert.ToInt32(Console.ReadLine()); orderedProduct.Calc(number); Console.WriteLine("Стоимость товара = " + orderedProduct.Amount); Console.ReadKey(); } C# Вызов конструктора Емельянов В.А.: Объектно-ориентированное программирование 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
  • 17. 17 Инкапсуляция – скрытие деталей внутреннего устройства класса от внешних по отношению к нему объектов или классов.  Поля закрываются от доступа извне  Доступ к закрытым полям выполняется через открытые методы, играющие роль интерфейса (интерфейсные методы) Инкапсуляция UML Емельянов В.А.: Объектно-ориентированное программирование
  • 18. 18 Инкапсуляция class Employee { //закрытые данные класса private string FullName; private int EmpID; private float CurrPay; //конструктор public Employee(string FName, int EmployeeID, float CurrentPay) { FullName = FName; EmpID = EmployeeID; CurrPay = CurrentPay; } //метод для увеличения зарплаты работника public void GiveBonus(float amount) { CurrPay = CurrPay + amount; } } C# Инкапсуляция Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 скрытые поля открытые интерфейсные методы
  • 19. 19  борьба со сложностью  безопасность внутренних данных  возможность изменять «внутренности», не меняя интерфейс Зачем нужна инкапсуляция? Емельянов В.А.: Объектно-ориентированное программирование
  • 20. 20 Наследование Наследование (inheritance) – механизм создания новых классов на основе существующих.  При наследовании дочернему классу (subclass) передаются поля и методы родительского класса (superclass)  У класса может быть один родитель и любое количество дочерних классов родительский класс дочерний класс Transport Car Bicycle Емельянов В.А.: Объектно-ориентированное программирование
  • 21. 21 Наследование Наследование в разработке кода:  Определение нового типа данных путем указания отличий от ранее определенного типа данных.  Определяемый тип данных будет содержать поля и методы предка (унаследованные поля и методы) и поля и методы, определенные в нем самом. //Класс предок class ClassA { //Поля //Методы() } C# //Класс потомок(наследник) class ClassB : ClassA { //Дополнительные поля //Дополнительные методы() } C# Наследование в проектировании: UML Емельянов В.А.: Объектно-ориентированное программирование
  • 22. 22 Наследование Особенности наследования в C# (Java, PHP и др.):  Класс предок может иметь несколько классов потомков  Класс может иметь не более одного предка (множественное наследование запрещено, в отличие от C++ и UML) Класс предок Класс потомок 2Класс потомок 1 Класс потомок Класс предок 2Класс предок 1 Емельянов В.А.: Объектно-ориентированное программирование
  • 23. 23 Наследование class Manager : Employee { //менеджерам необходимо знать кол-во //имеющихся у них опционов на акции private int numberOfOptions; public void NumOptions(int count) { numberOfOptions = count; } } class SalesPerson : Employee { //продавцам надо знать объем продаж private int numberOfSales; public void NumSales(int count) { numberOfSales = count; } } C# static void Main(string[] args) { //создаем объект продавец с именем Ivan: SalesPerson Ivan = new SalesPerson(); //Этот член унаследован от //базового класса Employee: Ivan.GiveBonus(5000); //А это уникальный член //определенный в классе-наследнике: Ivan.NumSales(80); } Объявление классов-наследников Manager и SalesPerson: Создание объекта класса-наследника SalesPerson: Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
  • 24. 24 Полиморфизм Полиморфизм (polymorphism) – реализация одной и той же операции по разному  имеется несколько реализаций алгоритма  выбор реализации осуществляется в зависимости от типа объекта и типа параметров Механизмы реализации полиморфизма Перегрузка (overloading) методов и операций Переопределение (overriding) методов и операций Емельянов В.А.: Объектно-ориентированное программирование
  • 25. 25 Полиморфизм: переопределение методов (overriding) Переопределим реакцию объектов производных классов на метод базового класса (метод увеличения зарплаты сотрудников): UML 1. Метод базового класса, который будет переопределен должен быть объявлен, как виртуальный (ключевое слово virtual): class Employee { //метод для увеличения зарплаты работника public virtual void GiveBonus(float amount) { CurrPay = CurrPay + amount; } } C# Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9
  • 26. 26 Полиморфизм: переопределение методов (overriding) 2. Переопределяя виртуальный метод в классе-наследнике, необходимо заново определить его, используя ключевое слово override: class SalesPerson : Employee { public override void GiveBonus(float amount) { int SalesBonus = 0; //кратность надбавки //надбавка зависит от объема продаж if (numberOfSales >=0 && numberOfSales <=100) SalesBonus = 2; else SalesBonus = 5; base.GiveBonus(amount * SalesBonus); } } C# Емельянов В.А.: Объектно-ориентированное программирование 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
  • 27. 27 Полиморфизм: переопределение методов (overriding) class Manager : Employee { public int numOfSalesPerson = 10; //количество продавцов в подчинении public override void GiveBonus(float amount) { base.GiveBonus(amount+amount*numOfSalesPerson*(float)0.1); } } C# static void Main(string[] args) { //Улучшенная система премирования Manager Nick = new Manager(); //Создаем менеджера Nick Nick.GiveBonus(5000); SalesPerson Ivan = new SalesPerson(); //Создаем продавца Ivan Ivan.GiveBonus(1000); } C# Вызов переопределенных методов: Переопределение метода GiveBonus() класса Manager: Емельянов В.А.: Объектно-ориентированное программирование 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
  • 28. 28 Полиморфизм: перегрузка методов (overloading) В C# допускается совместное использование одного и того же имени двумя или более методами одного и того же класса, при условии, что их параметры объявляются по- разному. В этом случае говорят, что методы перегружаются, а сам процесс называется перегрузкой методов. Условия перегрузки методов:  разный тип передаваемых параметров  разное количество передаваемых параметров  комбинация первых двух случаев Емельянов В.А.: Объектно-ориентированное программирование
  • 29. 29 Полиморфизм: перегрузка методов (overloading) class OverloadMethods { public int methodSum(int param1, int param2) { return param1 + param2; } public int methodSum(int param1, int param2, int param3) { return param1 + param2 + param3; } public double methodSum(double param1, double param2) { return param1 + param2; } } C# Разное количество и тип параметров Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Перегруженные методы
  • 30. 30 Полиморфизм: перегрузка методов (overloading) class Employee { //закрытые данные класса private string FullName; private int EmpID; private float CurrPay; //метод для увеличения зарплаты работника public void GiveBonus(float amount) { CurrPay = CurrPay + amount; } //метод увеличения зарплаты работника от объема продаж public void GiveBonus(float amount, int sales) { CurrPay = CurrPay + amount*sales; } } C# Перегруженные методы Емельянов В.А.: Объектно-ориентированное программирование 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
  • 31. Steve Jobs, 1994, интервью журналу Rolling Stone:  «Объекты – они как люди. Они живые вещи, у которых есть разум, позволяющий им знать, как сделать ту или иную вещь, у них есть память. Вы взаимодействуете с ними на очень высоком уровне абстракции, словно с людьми.  Например, я – ваш объект, занимающийся чисткой ваших вещей. Вы можете дать мне грязную одежду и послание “доставь мои вещи в прачечную”. Я знаю, где в Сан-Франциско лучшая прачечная, я говорю по- английски и у меня есть деньги в кармане. Я выхожу, ловлю такси, посещаю прачечную и возвращаюсь с вашими вещами и словами: “Вот, ваша чистая одежда”.  Вы не знаете, как я это сделал. Не знаете, где эта прачечная или вы говорите по-французски, а может у вас нет денег, чтобы поймать такси. Однако, я знал, как все это сделать, а вам – это знать необязательно. Вся сложность процесса скрыта внутри меня, но наше с вами общение было простым – в этом вся суть объектов. СЛОЖНОСТИ – ВНУТРИ, НО ИНТЕРФЕЙС – ДОСТУПЕН КАЖДОМУ.» Не могли бы вы в нескольких словах объяснить, что же такое объектно-ориентированное программное обеспечение? ?