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

Содержание

Слайд 2

Тенденции разработки ПО переход от расчетов по формулам к сложным задачам

Тенденции разработки ПО

переход от расчетов по формулам к сложным задачам моделирования

систем;
увеличение объемов обрабатываемых данных;
повышение сложности программ, увеличение их длины (до миллионов строк кода!).

Сложность программ превышает возможности одного человека (программиста).

!

В итоге:
коллективная разработка
каждый делает свою часть независимо от других
части программы легко «собрать» вместе

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 3

Тенденции разработки ПО Алгоритмическая декомпозиция Структурное и процедурное программирование: ПРОБЛЕМА: «Люди

Тенденции разработки ПО

Алгоритмическая декомпозиция

Структурное и процедурное программирование:

ПРОБЛЕМА: «Люди воспринимают мир, состоящий

из объектов» (Р. Декарт).

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 4

Объектно-ориентированное программирование Что понимает компьютер Как человеку проще записывать действия Как

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

Что понимает компьютер

Как человеку проще записывать действия

Как человеку проще мыслить

Ассемблер

(машинный код)

Процедурное программирование

Парадигмы программирования

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 5

ООП – это парадигма программирования, в которой базовым является понятие объекта.

ООП – это парадигма программирования, в которой базовым является понятие объекта.


Объект в программе – это абстракция реального объекта
Абстракция – это выделение существенных свойств объекта, отличающих его от других объектов

Объектно-ориентированное программирование (ООП)

Емельянов В.А.: Объектно-ориентированное программирование

Программа в ходе работы представляет собой набор взаимодействующих объектов

Слайд 6

Понятие объекта Емельянов В.А.: Объектно-ориентированное программирование

Понятие объекта

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 7

Понятие класса Класс (class) описывает признаки состояния и поведение множества схожих

Понятие класса

Класс (class) описывает признаки состояния и поведение множества схожих объектов.
Класс

– это пользовательский тип данных

Класс

Поля

Методы

состояние (state)

поведение
(behavior)

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 8

Создание класса C# Емельянов В.А.: Объектно-ориентированное программирование Класс на С# описывается

Создание класса

C#

Емельянов В.А.: Объектно-ориентированное программирование

Класс на С# описывается следующим образом:
[модификаторы]

class имя_класса [ : предки]
{
//тело класса (поля и методы)
}
Слайд 9

Создание класса UML C# Product +Price:float +Amount:float -pID:Integer +Calc(Count:integer) class Product

Создание класса

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) {

Создание объекта класса (экземпляра класса)

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

Конструктор


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("Введите

Конструктор

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

Инкапсуляция

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) – механизм создания новых классов на основе существующих.

Наследование

Наследование (inheritance) – механизм создания новых классов на основе существующих.
При наследовании

дочернему классу (subclass) передаются поля и методы родительского класса (superclass)
У класса может быть один родитель и любое количество дочерних классов

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 21

Наследование Наследование в разработке кода: Определение нового типа данных путем указания

Наследование

Наследование в разработке кода:
Определение нового типа данных путем указания отличий от

ранее определенного типа данных.
Определяемый тип данных будет содержать поля и методы предка (унаследованные поля и методы) и поля и методы, определенные в нем самом.

//Класс предок
class ClassA
{
//Поля
//Методы()
}

C#

//Класс потомок(наследник)
class ClassB : ClassA
{
//Дополнительные поля
//Дополнительные методы()
}

C#

Наследование в проектировании:

UML

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 22

Наследование Особенности наследования в C# (Java, PHP и др.): Класс предок

Наследование

Особенности наследования в C# (Java, PHP и др.):
Класс предок может иметь

несколько классов потомков
Класс может иметь не более одного предка (множественное наследование запрещено, в отличие от C++ и UML)

Класс потомок

Класс предок 2

Класс предок 1

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 23

Наследование class Manager : Employee { //менеджерам необходимо знать кол-во //имеющихся

Наследование

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) – реализация одной и той же операции по

Полиморфизм

Полиморфизм (polymorphism) – реализация одной и той же операции по разному

имеется

несколько реализаций алгоритма
выбор реализации осуществляется в зависимости от типа объекта и типа параметров

Механизмы реализации полиморфизма

Перегрузка (overloading)
методов и операций

Переопределение (overriding) методов и операций

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 25

Полиморфизм: переопределение методов (overriding) Переопределим реакцию объектов производных классов на метод

Полиморфизм: переопределение методов (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. Переопределяя виртуальный метод в классе-наследнике, необходимо

Полиморфизм: переопределение методов (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

Полиморфизм: переопределение методов (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# допускается совместное использование одного и

Полиморфизм: перегрузка методов (overloading)

В C# допускается совместное использование одного и того

же имени двумя или более методами одного и того же класса, при условии, что их параметры объявляются по-разному. В этом случае говорят, что методы перегружаются, а сам процесс называется перегрузкой методов.

Условия перегрузки методов:
разный тип передаваемых параметров
разное количество передаваемых параметров
комбинация первых двух случаев

Емельянов В.А.: Объектно-ориентированное программирование

Слайд 29

Полиморфизм: перегрузка методов (overloading) class OverloadMethods { public int methodSum(int param1,

Полиморфизм: перегрузка методов (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

Полиморфизм: перегрузка методов (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