SlideShare une entreprise Scribd logo
1  sur  42
1
3. Наследование и полиморфизм
() Владислав Лавров, vlavrov.com
Объектно-ориентированное программирование
2
Наследование — возможность создавать новые определения классов
на основе существующих.
Класс, который наследуется, называется базовым, а класс, который наследует, —
производным.
Производный класс представляет собой специализированный вариант базового класса.
Он наследует все переменные, методы и свойства, определяемые в базовом классе,
добавляя к ним свои собственные элементы.
Главное преимущество наследования — как только будет создан базовый класс, в
котором определены общие для множества объектов атрибуты, он может быть
использован для создания любого числа более конкретных производных классов. А в
каждом производном классе может быть точно выстроена своя собственная
классификация.
3.1. Основы наследования
() Владислав Лавров, vlavrov.com
3
• Классическое, по типу «быть» («is-a»).
Основная идея – производные классы должны получать
функциональность от базового класса-предка и дополнять
ее новыми возможностями.
• Делегирование, по типу «иметь» («has-a»).
Назначение – объединить в производном классе для
взаимодействия друг с другом несколько независимых
классов.
3.2. Виды наследования
() Владислав Лавров, vlavrov.com
4
Классическое наследование по типу «быть» («is-a»)
Пример. Теплопередача через многослойную огнеупорную стенку
q
aраб aокр
окрt
рабt
q
S1
l1
tпов.раб.
tпов.окр
t1-2
S2
l2
рабt
aраб
aокр
окрt
l1, l2
S1, S2
Rраб
q
Rcт1, Rcт2
Rокр
Расчет тепловых
сопротивлений,
температуры на
границе слоев и
плотности
теплового потока t1-2
Огнеупорный слой – это часть огнеупорной стенки
() Владислав Лавров, vlavrov.com
5
Базовый класс
Производный класс
() Владислав Лавров, vlavrov.com
6
Классическое наследование по типу «быть» («is-a»)
Базовый класс
Производный класс
Огнеупорный слой (LayerFlux) – это часть огнеупорной стенки (Wall)
() Владислав Лавров, vlavrov.com
7
Реализация классического наследования по типу «быть» («is-a»)
() Владислав Лавров, vlavrov.com
8
Пример реализации перегруженного метода в производном классе
() Владислав Лавров, vlavrov.com
9
Наследование по типу «иметь» («has-a»)
() Владислав Лавров, vlavrov.com
10
Пример реализации наследования по типу «иметь» («has-a»)
() Владислав Лавров, vlavrov.com
11
3.3. Организация защищенного доступа
Защищенный член создается с помощью модификатора доступа protected.
Используя модификатор доступа protected, можно создать члены класса,
являющиеся закрытыми для своего класса, но все же наследуемыми и
доступными для производного класса.
Mодификатор доступа protected следует применять в том случае, если
требуется создать член класса, доступный для всей иерархии классов, но
для остального кода он должен быть закрытым.
Для управления доступом к значению члена класса лучше воспользоваться
свойством.
() Владислав Лавров, vlavrov.com
12
Пример
реализации
защищенного
доступа
Используем в
наследуемом
классе
защищенные
члены базового
класса
() Владислав Лавров, vlavrov.com
13
3.4. Ключевое слово sealed
Ключевое слово sealed исключает наследование.
Если класс помечен как sealed (запечатанный), компилятор не позволяет
наследовать от него.
Наследовать ClassA нельзя,
т.к. он помечен как sealed
() Владислав Лавров, vlavrov.com
14
Необходимость использования sealed
1. Класс или метод обеспечивает внутренние действия библиотеки,
класса или других разрабатываемых классов, поэтому любая
попытка переопределить некоторую его функциональность
приведет к нестабильности кода.
2. Коммерческие соображения, чтобы предотвратить использование
классов способом, противоречащим лицензионным соглашениям.
() Владислав Лавров, vlavrov.com
15
3.5. Конструкторы и наследование
Вопрос: Какой конструктор отвечает за построение объекта
производного класса: конструктор базового класса, конструктор
производного класса или же оба?
Ответ: Конструктор базового класса конструирует базовую часть
объекта, а конструктор производного – производную часть этого
объекта.
Используется ключевое слово base:
• во-первых, для вызова конструктора базового класса;
• во-вторых, для доступа к члену базового класса,
скрывающегося за членом производного класса.
() Владислав Лавров, vlavrov.com
16
Пример
использования
ключевого слова
base
Вывод в консоль:
«Координаты объекта: 1, 4, 5»
Вывод в консоль:
«Новые координаты объекта: 10, 40, 50»
В конструкторе производного
класса использовано слово base.
Поэтому будет вызван
конструктор базового класса
MyClass
() Владислав Лавров, vlavrov.com
17
Пример
Иерархия классов сотрудников
Производный класс
SalesPerson (Продавец)
Введено новое свойство
NumberOfSales (Число продаж)
Базовый класс
Employee (Работник)
Производный класс
ManagerPerson (Менеджер)
Введено новое свойство
NumberOfOptions (Число опционов)
() Владислав Лавров, vlavrov.com
18
Пример
Определение производных классов сотрудников в классическом варианте
() Владислав Лавров, vlavrov.com
19
Пример
Проверяем новую функциональность производных классов
У продавца новое
свойство –
NumberOfSales
(Число продаж)
У менеджера новое
свойство –
NumberOfOptions
(Число опционов)
() Владислав Лавров, vlavrov.com
20
Пример
Более эффективно определение производных классов
с помощью ключевого слова base
() Владислав Лавров, vlavrov.com
21
Принципы действия ключевого слова base
• Когда в производном классе указывается ключевое слово base, то
вызывается конструктор из его непосредственного базового класса.
• Ключевое слово base всегда обращается к базовому классу, стоящему в
иерархии непосредственно над вызывающим классом.
• Аргументы передаются базовому конструктору в качестве аргументов
метода base (аргументы).
• Если же ключевое слово отсутствует, то автоматически вызывается
конструктор, используемый в базовом классе по умолчанию.
() Владислав Лавров, vlavrov.com
22
Полиморфизм предоставляет подклассу способ определения собственной
версии метода, определенного в его базовом классе, с использованием
процесса, который называется переопределением метода (method overriding).
Виртуальным называется такой метод, который объявляется как virtual в
базовом классе. Виртуальный метод отличается тем, что он может быть
переопределен в одном или нескольких производных классах.
Вариант выполняемого виртуального метода выбирается по типу объекта,
а не по типу ссылки на этот объект.
3.6. Поддержка полиморфизма в C#. Виртуальные методы и свойства
() Владислав Лавров, vlavrov.com
23
Пример
Улучшить систему бонусов у продавцов и менеджеров
В базовом классе Employee методы GiveBonus и DisplayStats сделаем виртуальными
() Владислав Лавров, vlavrov.com
24
Пример
Для Продавца в производном классе переопределим расчет бонусов по
новому алгоритму в зависимости от количества продаж
() Владислав Лавров, vlavrov.com
25
Пример
Для Менеджера в производном классе переопределим расчет бонусов:
кроме денег он получит дополнительные опционы на акции
() Владислав Лавров, vlavrov.com
26
Пример
Проверяем новую функциональность производных классов
Переопределим
метод DisplayStats()
в классе
ManagerPerson
Переопределим
метод DisplayStats()
в классе
SalesPerson
() Владислав Лавров, vlavrov.com
27
Абстрактный класс — это базовый класс, который не предполагает создания
экземпляров через вызов конструктора напрямую, но экземпляр
абстрактного класса создается неявно при построении экземпляра
производного конкретного класса.
Для объявление используется ключевой слово abstract.
Ключевое слово abstract может использоваться с классами, методами,
свойствами, индексаторами и событиями.
3.7. Абстрактные классы
() Владислав Лавров, vlavrov.com
28
Пример
Использование абстрактного класса
………
………
В производном классе методы
GiveBonus(…) и DisplayStats()
обязательно надо переопределить
В базовом классе методы
GiveBonus(…) и DisplayStats()
объявлены как абстрактные. В
наследуемых классах их
обязательно надо переопределить
Класс Employee объявлен как абстрактный.
Экземпляров создать нельзя.
() Владислав Лавров, vlavrov.com
29
Возможности и ограничения абстрактных классов:
• Экземпляр абстрактного класса создать нельзя через вызов конструктора
напрямую, но экземпляр абстрактного класса создается неявно при
построении экземпляра производного конкретного класса.
• Абстрактные классы могут содержать как абстрактные, так и не
абстрактные члены.
• Неабстрактный (конкретный) класс, являющийся производным от
абстрактного, должен содержать фактические реализации всех
наследуемых абстрактных членов.
Абстрактные классы
() Владислав Лавров, vlavrov.com
30
Возможности абстрактных методов:
• Абстрактный метод является неявным виртуальным методом.
• Создание абстрактных методов допускается только в абстрактных классах.
• Тело абстрактного метода отсутствует; создание метода просто
заканчивается двоеточием, а после сигнатуры ставить фигурные скобки ({ })
не нужно.
• Реализация предоставляется методом переопределения override, который
является членом неабстрактного класса.
Абстрактные методы
() Владислав Лавров, vlavrov.com
31
3.8. Принудительный полиморфизм: абстрактные методы
Пример
Иерархия классов геометрических фигур
() Владислав Лавров, vlavrov.com
32
Пример
Реализация базового класса геометрических фигур
Класс Shape объявлен
как абстрактный, поэтому создание
объектов (экземпляров) класса
Shape запрещено.
На его основе могут быть созданы
конкретные фигуры
() Владислав Лавров, vlavrov.com
33
Пример
Реализация производных классов геометрических фигур
В классе Circle метод Draw() не
замещен, поэтому он будет
перенаправлен к его реализации в
базовом классе Shape
В классе Hexagon метод Draw()
замещен, поэтому он будет
реализован в производном
() Владислав Лавров, vlavrov.com
34
Пример
Вывод реализации в консоль
() Владислав Лавров, vlavrov.com
35
Пример
Чтобы гарантировать, что каждый производный класс обязательно заместил
метод Draw(), надо объявить его абстрактным в базовом классе Shape
() Владислав Лавров, vlavrov.com
36
Пример
В производном классе Circle метод Draw() теперь обязательно надо заместить
() Владислав Лавров, vlavrov.com
37
Пример
Вывод реализации в консоль.
Теперь всегда известно кто создал фигуры, поскольку конкретная
реализация метода будет выбрана автоматически в зависимости от
того, для объекта какого класса был вызван этот метод.
() Владислав Лавров, vlavrov.com
38
Пример
Новая иерархия классов геометрических фигур: добавлен Oval (Эллипс)
3.9. Контроль версий членов класса: сокрытие методов
() Владислав Лавров, vlavrov.com
39
Пример
Реализация класса Oval с уникальной логикой метода Draw()
Чтобы реализовать полностью новый метод Draw(), отличный от метода
Circle.Draw(), при объявлении метода надо использовать ключевое слово new
() Владислав Лавров, vlavrov.com
40
Пример
Проверим реализацию класса Oval с уникальной логикой метода Draw()
() Владислав Лавров, vlavrov.com
41
Пример
Если надо, то можно для объекта класса Oval вызвать реализацию метода
Draw() из базового класса.
Это можно сделать – с помощью явного приведения типов.
() Владислав Лавров, vlavrov.com
42
Когда использовать сокрытие метода?
Применяется в тех ситуациях, когда необходимо произвести
класс от базового класса, определенного в другой сборке NET.
Если метод в другой сборке несовместим с нашей
реализацией, то в производном классе надо сделать нашу
собственную реализацию метода с ключевым словом new.
() Владислав Лавров, vlavrov.com

Contenu connexe

Tendances

принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#bolevik
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Anton Moiseenko
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.Igor Shkulipa
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptAnton Moiseenko
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.Igor Shkulipa
 
C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16. C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16. Igor Shkulipa
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.Igor Shkulipa
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3Technopark
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Unguryan Vitaliy
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Technopark
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Anton Moiseenko
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Javametaform
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoFUnguryan Vitaliy
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.Igor Shkulipa
 

Tendances (17)

принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#принципы ооп и программирование классов в C#
принципы ооп и программирование классов в C#
 
Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.Java Core. Lecture# 3. Part# 3. Multithreading.
Java Core. Lecture# 3. Part# 3. Multithreading.
 
C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.C++ Базовый. Занятие 08.
C++ Базовый. Занятие 08.
 
Java core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.pptJava core-lect6-part2-reflection-api.ppt
Java core-lect6-part2-reflection-api.ppt
 
C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.C++ Базовый. Занятие 09.
C++ Базовый. Занятие 09.
 
C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16. C++ Базовый. Занятие 16.
C++ Базовый. Занятие 16.
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.C++ Базовый. Занятие 11.
C++ Базовый. Занятие 11.
 
C++ осень 2013 лекция 3
C++ осень 2013 лекция 3C++ осень 2013 лекция 3
C++ осень 2013 лекция 3
 
Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация Java. Конструкторы класса и инициализация
Java. Конструкторы класса и инициализация
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2
 
Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.Java Core. Lecture# 3. Part# 2. Exceptions.
Java Core. Lecture# 3. Part# 2. Exceptions.
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Шаблоны проектирования GoF
Шаблоны проектирования GoFШаблоны проектирования GoF
Шаблоны проектирования GoF
 
C# Desktop. Занятие 02.
C# Desktop. Занятие 02.C# Desktop. Занятие 02.
C# Desktop. Занятие 02.
 

Similaire à Наследование и полиморфизм

C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2Technopark
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.Igor Shkulipa
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.Unguryan Vitaliy
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.Unguryan Vitaliy
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxrobete3065
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4Technopark
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Javaitc73
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекцийstudent_kai
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутриRoman Brovko
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в javaUnguryan Vitaliy
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansmetaform
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в JavaRoman Brovko
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Umlolegol
 
Rubizza #1 Lecture Ruby OOP
Rubizza #1 Lecture Ruby OOPRubizza #1 Lecture Ruby OOP
Rubizza #1 Lecture Ruby OOPRubizza
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLcolriot
 

Similaire à Наследование и полиморфизм (20)

C++ осень 2012 лекция 2
C++ осень 2012 лекция 2C++ осень 2012 лекция 2
C++ осень 2012 лекция 2
 
Step 3.1
Step 3.1Step 3.1
Step 3.1
 
JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.JavaScript Базовый. Занятие 04.
JavaScript Базовый. Занятие 04.
 
модуль 04
модуль 04модуль 04
модуль 04
 
Java. Наследование.
Java. Наследование.Java. Наследование.
Java. Наследование.
 
Java. Полиморфизм.
Java. Полиморфизм.Java. Полиморфизм.
Java. Полиморфизм.
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
 
Step 3.2
Step 3.2Step 3.2
Step 3.2
 
C++ осень 2013 лекция 4
C++ осень 2013 лекция 4C++ осень 2013 лекция 4
C++ осень 2013 лекция 4
 
Lec 2 Java
Lec 2 JavaLec 2 Java
Lec 2 Java
 
презентация конспекта лекций
презентация конспекта лекцийпрезентация конспекта лекций
презентация конспекта лекций
 
Lec 2
Lec 2Lec 2
Lec 2
 
08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри08 - Java. Java-классы: взгляд изнутри
08 - Java. Java-классы: взгляд изнутри
 
Рефлексия в java
Рефлексия в javaРефлексия в java
Рефлексия в java
 
Глава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeansГлава 2: Среда разработки NetBeans
Глава 2: Среда разработки NetBeans
 
03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java03 - Java. Объекты, классы и пакеты в Java
03 - Java. Объекты, классы и пакеты в Java
 
Msu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And UmlMsu.Center.Lectures.J03 Oop And Uml
Msu.Center.Lectures.J03 Oop And Uml
 
Rubizza #1 Lecture Ruby OOP
Rubizza #1 Lecture Ruby OOPRubizza #1 Lecture Ruby OOP
Rubizza #1 Lecture Ruby OOP
 
Java. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UMLJava. Lecture 03. OOP and UML
Java. Lecture 03. OOP and UML
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 

Plus de Ural Federal University named after First President of Russia B.N. Yeltsin

Plus de Ural Federal University named after First President of Russia B.N. Yeltsin (20)

2016 ВКР Черемискина Н.А.
2016 ВКР Черемискина Н.А.2016 ВКР Черемискина Н.А.
2016 ВКР Черемискина Н.А.
 
2016 ВКР Гребнева Н.В.
2016 ВКР Гребнева Н.В.2016 ВКР Гребнева Н.В.
2016 ВКР Гребнева Н.В.
 
2016 ВКР Имашева А.А.
2016 ВКР Имашева А.А.2016 ВКР Имашева А.А.
2016 ВКР Имашева А.А.
 
Введение в методы agile
Введение в методы agileВведение в методы agile
Введение в методы agile
 
ООП. Рекомендуемые информационные ресурсы
ООП. Рекомендуемые информационные ресурсыООП. Рекомендуемые информационные ресурсы
ООП. Рекомендуемые информационные ресурсы
 
Методоллогии Agile
Методоллогии AgileМетодоллогии Agile
Методоллогии Agile
 
3. Общая характеристика АСУ
3. Общая характеристика АСУ3. Общая характеристика АСУ
3. Общая характеристика АСУ
 
3. Информация и ее роль
3. Информация и ее роль3. Информация и ее роль
3. Информация и ее роль
 
Образовательная программа ИСТ на кафедре ТИМ УрФУ
Образовательная программа ИСТ на кафедре ТИМ УрФУОбразовательная программа ИСТ на кафедре ТИМ УрФУ
Образовательная программа ИСТ на кафедре ТИМ УрФУ
 
1. Кафедра ТИМ УрФУ
1. Кафедра ТИМ УрФУ1. Кафедра ТИМ УрФУ
1. Кафедра ТИМ УрФУ
 
магистратура 09.04.02 ист на кафедре тим урфу+
магистратура 09.04.02 ист на кафедре тим урфу+магистратура 09.04.02 ист на кафедре тим урфу+
магистратура 09.04.02 ист на кафедре тим урфу+
 
магистратура 22.04.02 металлургия на кафедре тим+
магистратура 22.04.02 металлургия на кафедре тим+магистратура 22.04.02 металлургия на кафедре тим+
магистратура 22.04.02 металлургия на кафедре тим+
 
1.5 тп (технологические подходы)+
1.5 тп (технологические подходы)+1.5 тп (технологические подходы)+
1.5 тп (технологические подходы)+
 
1.4 тп (общие принципы разработки)+
1.4 тп (общие принципы разработки)+1.4 тп (общие принципы разработки)+
1.4 тп (общие принципы разработки)+
 
1.3 тп (источники ошибок)+
1.3 тп (источники ошибок)+1.3 тп (источники ошибок)+
1.3 тп (источники ошибок)+
 
2014 Сабиров Е.Р. презентация КП по ПБД
2014 Сабиров Е.Р. презентация КП по ПБД2014 Сабиров Е.Р. презентация КП по ПБД
2014 Сабиров Е.Р. презентация КП по ПБД
 
2014 Мищенко К.В. презентация КП по ПБД
2014 Мищенко К.В. презентация КП по ПБД2014 Мищенко К.В. презентация КП по ПБД
2014 Мищенко К.В. презентация КП по ПБД
 
2014 Пильщиков С.Н. презентация КП по ПБД
2014 Пильщиков С.Н. презентация КП по ПБД2014 Пильщиков С.Н. презентация КП по ПБД
2014 Пильщиков С.Н. презентация КП по ПБД
 
2014 диплом Терехова А.Ю
2014 диплом Терехова А.Ю2014 диплом Терехова А.Ю
2014 диплом Терехова А.Ю
 
2014 диплом Мухаметшин Р.Р
2014 диплом Мухаметшин Р.Р2014 диплом Мухаметшин Р.Р
2014 диплом Мухаметшин Р.Р
 

Наследование и полиморфизм

  • 1. 1 3. Наследование и полиморфизм () Владислав Лавров, vlavrov.com Объектно-ориентированное программирование
  • 2. 2 Наследование — возможность создавать новые определения классов на основе существующих. Класс, который наследуется, называется базовым, а класс, который наследует, — производным. Производный класс представляет собой специализированный вариант базового класса. Он наследует все переменные, методы и свойства, определяемые в базовом классе, добавляя к ним свои собственные элементы. Главное преимущество наследования — как только будет создан базовый класс, в котором определены общие для множества объектов атрибуты, он может быть использован для создания любого числа более конкретных производных классов. А в каждом производном классе может быть точно выстроена своя собственная классификация. 3.1. Основы наследования () Владислав Лавров, vlavrov.com
  • 3. 3 • Классическое, по типу «быть» («is-a»). Основная идея – производные классы должны получать функциональность от базового класса-предка и дополнять ее новыми возможностями. • Делегирование, по типу «иметь» («has-a»). Назначение – объединить в производном классе для взаимодействия друг с другом несколько независимых классов. 3.2. Виды наследования () Владислав Лавров, vlavrov.com
  • 4. 4 Классическое наследование по типу «быть» («is-a») Пример. Теплопередача через многослойную огнеупорную стенку q aраб aокр окрt рабt q S1 l1 tпов.раб. tпов.окр t1-2 S2 l2 рабt aраб aокр окрt l1, l2 S1, S2 Rраб q Rcт1, Rcт2 Rокр Расчет тепловых сопротивлений, температуры на границе слоев и плотности теплового потока t1-2 Огнеупорный слой – это часть огнеупорной стенки () Владислав Лавров, vlavrov.com
  • 5. 5 Базовый класс Производный класс () Владислав Лавров, vlavrov.com
  • 6. 6 Классическое наследование по типу «быть» («is-a») Базовый класс Производный класс Огнеупорный слой (LayerFlux) – это часть огнеупорной стенки (Wall) () Владислав Лавров, vlavrov.com
  • 7. 7 Реализация классического наследования по типу «быть» («is-a») () Владислав Лавров, vlavrov.com
  • 8. 8 Пример реализации перегруженного метода в производном классе () Владислав Лавров, vlavrov.com
  • 9. 9 Наследование по типу «иметь» («has-a») () Владислав Лавров, vlavrov.com
  • 10. 10 Пример реализации наследования по типу «иметь» («has-a») () Владислав Лавров, vlavrov.com
  • 11. 11 3.3. Организация защищенного доступа Защищенный член создается с помощью модификатора доступа protected. Используя модификатор доступа protected, можно создать члены класса, являющиеся закрытыми для своего класса, но все же наследуемыми и доступными для производного класса. Mодификатор доступа protected следует применять в том случае, если требуется создать член класса, доступный для всей иерархии классов, но для остального кода он должен быть закрытым. Для управления доступом к значению члена класса лучше воспользоваться свойством. () Владислав Лавров, vlavrov.com
  • 13. 13 3.4. Ключевое слово sealed Ключевое слово sealed исключает наследование. Если класс помечен как sealed (запечатанный), компилятор не позволяет наследовать от него. Наследовать ClassA нельзя, т.к. он помечен как sealed () Владислав Лавров, vlavrov.com
  • 14. 14 Необходимость использования sealed 1. Класс или метод обеспечивает внутренние действия библиотеки, класса или других разрабатываемых классов, поэтому любая попытка переопределить некоторую его функциональность приведет к нестабильности кода. 2. Коммерческие соображения, чтобы предотвратить использование классов способом, противоречащим лицензионным соглашениям. () Владислав Лавров, vlavrov.com
  • 15. 15 3.5. Конструкторы и наследование Вопрос: Какой конструктор отвечает за построение объекта производного класса: конструктор базового класса, конструктор производного класса или же оба? Ответ: Конструктор базового класса конструирует базовую часть объекта, а конструктор производного – производную часть этого объекта. Используется ключевое слово base: • во-первых, для вызова конструктора базового класса; • во-вторых, для доступа к члену базового класса, скрывающегося за членом производного класса. () Владислав Лавров, vlavrov.com
  • 16. 16 Пример использования ключевого слова base Вывод в консоль: «Координаты объекта: 1, 4, 5» Вывод в консоль: «Новые координаты объекта: 10, 40, 50» В конструкторе производного класса использовано слово base. Поэтому будет вызван конструктор базового класса MyClass () Владислав Лавров, vlavrov.com
  • 17. 17 Пример Иерархия классов сотрудников Производный класс SalesPerson (Продавец) Введено новое свойство NumberOfSales (Число продаж) Базовый класс Employee (Работник) Производный класс ManagerPerson (Менеджер) Введено новое свойство NumberOfOptions (Число опционов) () Владислав Лавров, vlavrov.com
  • 18. 18 Пример Определение производных классов сотрудников в классическом варианте () Владислав Лавров, vlavrov.com
  • 19. 19 Пример Проверяем новую функциональность производных классов У продавца новое свойство – NumberOfSales (Число продаж) У менеджера новое свойство – NumberOfOptions (Число опционов) () Владислав Лавров, vlavrov.com
  • 20. 20 Пример Более эффективно определение производных классов с помощью ключевого слова base () Владислав Лавров, vlavrov.com
  • 21. 21 Принципы действия ключевого слова base • Когда в производном классе указывается ключевое слово base, то вызывается конструктор из его непосредственного базового класса. • Ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. • Аргументы передаются базовому конструктору в качестве аргументов метода base (аргументы). • Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию. () Владислав Лавров, vlavrov.com
  • 22. 22 Полиморфизм предоставляет подклассу способ определения собственной версии метода, определенного в его базовом классе, с использованием процесса, который называется переопределением метода (method overriding). Виртуальным называется такой метод, который объявляется как virtual в базовом классе. Виртуальный метод отличается тем, что он может быть переопределен в одном или нескольких производных классах. Вариант выполняемого виртуального метода выбирается по типу объекта, а не по типу ссылки на этот объект. 3.6. Поддержка полиморфизма в C#. Виртуальные методы и свойства () Владислав Лавров, vlavrov.com
  • 23. 23 Пример Улучшить систему бонусов у продавцов и менеджеров В базовом классе Employee методы GiveBonus и DisplayStats сделаем виртуальными () Владислав Лавров, vlavrov.com
  • 24. 24 Пример Для Продавца в производном классе переопределим расчет бонусов по новому алгоритму в зависимости от количества продаж () Владислав Лавров, vlavrov.com
  • 25. 25 Пример Для Менеджера в производном классе переопределим расчет бонусов: кроме денег он получит дополнительные опционы на акции () Владислав Лавров, vlavrov.com
  • 26. 26 Пример Проверяем новую функциональность производных классов Переопределим метод DisplayStats() в классе ManagerPerson Переопределим метод DisplayStats() в классе SalesPerson () Владислав Лавров, vlavrov.com
  • 27. 27 Абстрактный класс — это базовый класс, который не предполагает создания экземпляров через вызов конструктора напрямую, но экземпляр абстрактного класса создается неявно при построении экземпляра производного конкретного класса. Для объявление используется ключевой слово abstract. Ключевое слово abstract может использоваться с классами, методами, свойствами, индексаторами и событиями. 3.7. Абстрактные классы () Владислав Лавров, vlavrov.com
  • 28. 28 Пример Использование абстрактного класса ……… ……… В производном классе методы GiveBonus(…) и DisplayStats() обязательно надо переопределить В базовом классе методы GiveBonus(…) и DisplayStats() объявлены как абстрактные. В наследуемых классах их обязательно надо переопределить Класс Employee объявлен как абстрактный. Экземпляров создать нельзя. () Владислав Лавров, vlavrov.com
  • 29. 29 Возможности и ограничения абстрактных классов: • Экземпляр абстрактного класса создать нельзя через вызов конструктора напрямую, но экземпляр абстрактного класса создается неявно при построении экземпляра производного конкретного класса. • Абстрактные классы могут содержать как абстрактные, так и не абстрактные члены. • Неабстрактный (конкретный) класс, являющийся производным от абстрактного, должен содержать фактические реализации всех наследуемых абстрактных членов. Абстрактные классы () Владислав Лавров, vlavrov.com
  • 30. 30 Возможности абстрактных методов: • Абстрактный метод является неявным виртуальным методом. • Создание абстрактных методов допускается только в абстрактных классах. • Тело абстрактного метода отсутствует; создание метода просто заканчивается двоеточием, а после сигнатуры ставить фигурные скобки ({ }) не нужно. • Реализация предоставляется методом переопределения override, который является членом неабстрактного класса. Абстрактные методы () Владислав Лавров, vlavrov.com
  • 31. 31 3.8. Принудительный полиморфизм: абстрактные методы Пример Иерархия классов геометрических фигур () Владислав Лавров, vlavrov.com
  • 32. 32 Пример Реализация базового класса геометрических фигур Класс Shape объявлен как абстрактный, поэтому создание объектов (экземпляров) класса Shape запрещено. На его основе могут быть созданы конкретные фигуры () Владислав Лавров, vlavrov.com
  • 33. 33 Пример Реализация производных классов геометрических фигур В классе Circle метод Draw() не замещен, поэтому он будет перенаправлен к его реализации в базовом классе Shape В классе Hexagon метод Draw() замещен, поэтому он будет реализован в производном () Владислав Лавров, vlavrov.com
  • 34. 34 Пример Вывод реализации в консоль () Владислав Лавров, vlavrov.com
  • 35. 35 Пример Чтобы гарантировать, что каждый производный класс обязательно заместил метод Draw(), надо объявить его абстрактным в базовом классе Shape () Владислав Лавров, vlavrov.com
  • 36. 36 Пример В производном классе Circle метод Draw() теперь обязательно надо заместить () Владислав Лавров, vlavrov.com
  • 37. 37 Пример Вывод реализации в консоль. Теперь всегда известно кто создал фигуры, поскольку конкретная реализация метода будет выбрана автоматически в зависимости от того, для объекта какого класса был вызван этот метод. () Владислав Лавров, vlavrov.com
  • 38. 38 Пример Новая иерархия классов геометрических фигур: добавлен Oval (Эллипс) 3.9. Контроль версий членов класса: сокрытие методов () Владислав Лавров, vlavrov.com
  • 39. 39 Пример Реализация класса Oval с уникальной логикой метода Draw() Чтобы реализовать полностью новый метод Draw(), отличный от метода Circle.Draw(), при объявлении метода надо использовать ключевое слово new () Владислав Лавров, vlavrov.com
  • 40. 40 Пример Проверим реализацию класса Oval с уникальной логикой метода Draw() () Владислав Лавров, vlavrov.com
  • 41. 41 Пример Если надо, то можно для объекта класса Oval вызвать реализацию метода Draw() из базового класса. Это можно сделать – с помощью явного приведения типов. () Владислав Лавров, vlavrov.com
  • 42. 42 Когда использовать сокрытие метода? Применяется в тех ситуациях, когда необходимо произвести класс от базового класса, определенного в другой сборке NET. Если метод в другой сборке несовместим с нашей реализацией, то в производном классе надо сделать нашу собственную реализацию метода с ключевым словом new. () Владислав Лавров, vlavrov.com