SlideShare a Scribd company logo
1 of 16
Object-Oriented
Programming
2
Abstract class vs Interface
д.т.н. Емельянов Виталий Александрович
: v.yemelyanov@gmail.com
Виды наследования
2Емельянов В.А.: Объектно-ориентированное программирование
От простого
класса
От абстрактного
класса
Реализация
интерфейса
Абстрактные классы
3Емельянов В.А.: Объектно-ориентированное программирование
Абстрактный класс:
 используется для создания производных классов;
 базовый класс, который не предполагает создания экземпляров.
Назначение:
Абстрактные классы призваны предоставлять базовый функционал
(общие поля и методы) для классов-наследников. А производные
классы уже реализуют этот функционал.
При определении абстрактных классов используется ключевое
слово abstract:
abstract class Employee
{
}
C#
1
2
3
Абстрактные классы
4Емельянов В.А.: Объектно-ориентированное программирование
Кроме обычных методов абстрактный класс может содержать абстрактные
методы. Такие методы определяются с помощью ключевого слова
abstract и не имеют никакого функционала:
abstract class Employee
{
private String name;
public String getName() //обычный метод
{
return name; //реализация функционала обычного метода
}
public abstract void GiveBonus(float amount); //абстрактный метод
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Абстрактные классы
5Емельянов В.А.: Объектно-ориентированное программирование
Особенности:
 производный класс обязан переопределить и реализовать все
абстрактные методы, которые имеются в базовом абстрактном
классе;
 если класс имеет хотя бы один абстрактный метод, то данный класс
должен быть определен как абстрактный.
 производный класс в котором не будет замещен абстрактный
метод сам считается абстрактным, и мы не сможем создавать
объекты этого класса.
Ограничения наследования от классов
6Емельянов В.А.: Объектно-ориентированное программирование
В современных языках программирования (Java, C#, PHP и др.)
наследовать можно только от одного класса, в отличие,
например, от языка С++, где имеется множественное
наследование.
Интерфейсы
7Емельянов В.А.: Объектно-ориентированное программирование
Назначение:
 Интерфейс описывает поведение, которое конкретный класс
может выбрать для реализации.
 Класс может при необходимости поддерживать много
интерфейсов, тем самым поддерживая множество стилей
поведения.
Чтобы определить интерфейс, используется ключевое слово interface:
interface IMovable
{
}
C#
Интерфейс (interface) – именованный набор абстрактных членов
1
2
3
Интерфейсы
8Емельянов В.А.: Объектно-ориентированное программирование
Особенности интерфейса:
 Все методы интерфейса не имеют модификаторов доступа, но
фактически по умолчанию доступ public, так как цель интерфейса -
определение функционала для реализации его классом. Поэтому весь
функционал должен быть открыт для реализации.
Интерфейсы
9Емельянов В.А.: Объектно-ориентированное программирование
interface IMovable
{
void Move();
}
class Animal : IMovable
{
public void Move()
{
//код для реализации передвижения животного
}
}
class Human : IMovable
{
public void Move()
{
//код для реализации передвижения человека
}
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Различия абстрактного класса и
интерфейса
10Емельянов В.А.: Объектно-ориентированное программирование
Когда следует использовать
абстрактные классы?
11Емельянов В.А.: Объектно-ориентированное программирование
 Если необходимо определить общий функционал (поведение) для
родственных объектов
 Если проектируем довольно большую функциональную единицу,
которая содержит много базового функционала
 Если необходимо, чтобы все производные классы на всех уровнях
наследования имели некоторую общую реализацию
Если надо будет поменять название
или параметры метода интерфейса, то
придется вносить изменения и во все
классы, которые данный интерфейс
реализуют.
С абстрактными классами, если надо
изменить базовый функционал во всех
наследниках, то достаточно поменять
его в абстрактном базовом классе.
Когда следует использовать
интерфейсы?
12Емельянов В.А.: Объектно-ориентированное программирование
 Если необходимо определить функционал для группы
разрозненных объектов, которые могут быть никак не
связаны между собой
 Если проектируем небольшой функциональный тип
Пример использования абстрактных
классов
13Емельянов В.А.: Объектно-ориентированное программирование
Задача: Пусть есть система транспортных средств: легковой автомобиль,
автобус, трамвай, поезд и т.д. Поскольку данные объекты являются
родственными, мы можем выделить у них общие признаки, то в
данном случае можно использовать абстрактные классы:
C#
public abstract class Vehicle
{
public abstract void Move();
}
public class Car : Vehicle
{
public override void Move()
{
Console.WriteLine("Машина едет");
}
}
public class Bus : Vehicle
{
public override void Move()
{
Console.WriteLine("Автобус едет");
}
}
public class Tram : Vehicle
{
public override void Move()
{
Console.WriteLine("Трамвай едет");
}
}
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
Пример использования интерфейса
14Емельянов В.А.: Объектно-ориентированное программирование
Задача: Предположим, что система транспорта не ограничивается
вышеперечисленными транспортными средствами. Например,
можно добавить самолеты, лодки. Можно добавить лошадь -
животное, которое может также выполнять роль транспортного
средства. Т.е. получается широкий круг объектов, которые
связаны только тем, что являются транспортным средством и
должны реализовать метод Move(), выполняющий
перемещение.
Решение: Так как объекты малосвязанные между собой, то для
определения общего для всех них функционала лучше
определить интерфейс. Тем более некоторые из этих объектов
могут существовать в рамках параллельных систем
классификаций. Например, лошадь может быть классом в
структуре системы классов животного мира.
Пример использования интерфейса
15Емельянов В.А.: Объектно-ориентированное программирование
C#
public interface IMovable
{
void Move();
}
public abstract class Vehicle
{ }
public class Car : Vehicle, IMovable
{
public void Move()
{
Console.WriteLine("Машина едет");
}
}
public class Bus : Vehicle, IMovable
{
public void Move()
{
Console.WriteLine("Автобус едет");
}
}
public class Hourse : IMovable
{
public void Move()
{
Console.WriteLine("Лошадь скачет");
}
}
public class Aircraft : IMovable
{
public void Move()
{
Console.WriteLine("Самолет летит");
}
}
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
Заключение
16Емельянов В.А.: Объектно-ориентированное программирование
 абстрактные классы фокусируются на общем состоянии
классов-наследников, т.е. для одноплановых классов, которые
имеют общее состояние, лучше определять абстрактный класс.
 интерфейсы строятся вокруг какого-либо общего действия.
Если разноплановые классы обладают каким-то общим
действием, то это действие лучше выносить в интерфейс.

More Related Content

What's hot

практ заняття 23
практ заняття 23практ заняття 23
практ заняття 23
cit-cit
 
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
Сергей Чабан
 
модуль у шкільному курсі математики
модуль у шкільному курсі математикимодуль у шкільному курсі математики
модуль у шкільному курсі математики
kristina_chepil
 
Orgã¢nica hidrocarbonetos ramificados
Orgã¢nica   hidrocarbonetos ramificadosOrgã¢nica   hidrocarbonetos ramificados
Orgã¢nica hidrocarbonetos ramificados
paramore146
 
Контрольна робота по темі "Функції"
Контрольна робота по темі "Функції"Контрольна робота по темі "Функції"
Контрольна робота по темі "Функції"
sveta7940
 
геометрична прогресія презентація
геометрична прогресія презентаціягеометрична прогресія презентація
геометрична прогресія презентація
iri23shka
 
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
sveta7940
 
Презентація:Елементи прикладної математики
Презентація:Елементи прикладної математикиПрезентація:Елементи прикладної математики
Презентація:Елементи прикладної математики
sveta7940
 
координатна площина 6клас
координатна площина 6класкоординатна площина 6клас
координатна площина 6клас
Irina Biryuk
 

What's hot (20)

урок 3
урок 3урок 3
урок 3
 
5 кла обєм паралелепипеда
5 кла обєм паралелепипеда5 кла обєм паралелепипеда
5 кла обєм паралелепипеда
 
практ заняття 23
практ заняття 23практ заняття 23
практ заняття 23
 
Percursos em grafos
Percursos em grafosPercursos em grafos
Percursos em grafos
 
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
Приклади розв'язування задач по темі "Початкові відомості зі стереометрії"
 
модуль у шкільному курсі математики
модуль у шкільному курсі математикимодуль у шкільному курсі математики
модуль у шкільному курсі математики
 
1
11
1
 
Orgã¢nica hidrocarbonetos ramificados
Orgã¢nica   hidrocarbonetos ramificadosOrgã¢nica   hidrocarbonetos ramificados
Orgã¢nica hidrocarbonetos ramificados
 
ME2110 Final Presentation
ME2110 Final PresentationME2110 Final Presentation
ME2110 Final Presentation
 
Письменник, політик, архієпископ Лазар Баранович
 Письменник, політик, архієпископ Лазар Баранович  Письменник, політик, архієпископ Лазар Баранович
Письменник, політик, архієпископ Лазар Баранович
 
Дидактичні матеріали з математики для 11 класу рівня стандарту
Дидактичні матеріали з математики для 11 класу рівня стандартуДидактичні матеріали з математики для 11 класу рівня стандарту
Дидактичні матеріали з математики для 11 класу рівня стандарту
 
Контрольна робота по темі "Функції"
Контрольна робота по темі "Функції"Контрольна робота по темі "Функції"
Контрольна робота по темі "Функції"
 
Найпростіші тригонометричні рівняння
Найпростіші тригонометричні рівнянняНайпростіші тригонометричні рівняння
Найпростіші тригонометричні рівняння
 
Урок № 1. Вирази зі змінними. Цілі раціональні вирази
Урок № 1. Вирази зі змінними. Цілі раціональні виразиУрок № 1. Вирази зі змінними. Цілі раціональні вирази
Урок № 1. Вирази зі змінними. Цілі раціональні вирази
 
Teoria dos Grafos - História e COnceitos Iniciais
Teoria dos Grafos - História e COnceitos IniciaisTeoria dos Grafos - História e COnceitos Iniciais
Teoria dos Grafos - História e COnceitos Iniciais
 
геометрична прогресія презентація
геометрична прогресія презентаціягеометрична прогресія презентація
геометрична прогресія презентація
 
Сызықтық функция және оның графигі
Сызықтық функция және оның графигіСызықтық функция және оның графигі
Сызықтық функция және оның графигі
 
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
Контрольна робота по темі " Розв"язування задач за допомогою рівнянь"
 
Презентація:Елементи прикладної математики
Презентація:Елементи прикладної математикиПрезентація:Елементи прикладної математики
Презентація:Елементи прикладної математики
 
координатна площина 6клас
координатна площина 6класкоординатна площина 6клас
координатна площина 6клас
 

Similar to Лекция 2. Интерфейсы и абстрактные классы

Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
beloslab
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
Technopark
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
metaform
 
API design in java project
API design in java projectAPI design in java project
API design in java project
chashnikov
 

Similar to Лекция 2. Интерфейсы и абстрактные классы (20)

лекция №1
лекция №1лекция №1
лекция №1
 
Yuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practicesYuri Trukhin - Software developement best practices
Yuri Trukhin - Software developement best practices
 
C# vs C++
C# vs C++C# vs C++
C# vs C++
 
Классы и объекты С#
Классы и объекты С#Классы и объекты С#
Классы и объекты С#
 
Общие темы. Тема 02.
Общие темы. Тема 02.Общие темы. Тема 02.
Общие темы. Тема 02.
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
C++ осень 2012 лекция 6
C++ осень 2012 лекция 6C++ осень 2012 лекция 6
C++ осень 2012 лекция 6
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
Step 5
Step 5Step 5
Step 5
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
Лекция 2. UML (static logical model)
Лекция 2. UML (static logical model)Лекция 2. UML (static logical model)
Лекция 2. UML (static logical model)
 
Aspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design PatternsAspect Oriented Programming and Design Patterns
Aspect Oriented Programming and Design Patterns
 
AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)AOP and Design Patterns (GoF)
AOP and Design Patterns (GoF)
 
UML: Kinds of Diagram
UML:  Kinds of DiagramUML:  Kinds of Diagram
UML: Kinds of Diagram
 
Классы и объекты в Java
Классы и объекты в JavaКлассы и объекты в Java
Классы и объекты в Java
 
C# Desktop. Занятие 06.
C# Desktop. Занятие 06.C# Desktop. Занятие 06.
C# Desktop. Занятие 06.
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
API design in java project
API design in java projectAPI design in java project
API design in java project
 

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)
 
Лекция 4. Принципы SOLID
Лекция 4. Принципы SOLID Лекция 4. Принципы SOLID
Лекция 4. Принципы SOLID
 
Лекция 3. Связи между классами
Лекция 3. Связи между классамиЛекция 3. Связи между классами
Лекция 3. Связи между классами
 

Лекция 2. Интерфейсы и абстрактные классы

  • 1. Object-Oriented Programming 2 Abstract class vs Interface д.т.н. Емельянов Виталий Александрович : v.yemelyanov@gmail.com
  • 2. Виды наследования 2Емельянов В.А.: Объектно-ориентированное программирование От простого класса От абстрактного класса Реализация интерфейса
  • 3. Абстрактные классы 3Емельянов В.А.: Объектно-ориентированное программирование Абстрактный класс:  используется для создания производных классов;  базовый класс, который не предполагает создания экземпляров. Назначение: Абстрактные классы призваны предоставлять базовый функционал (общие поля и методы) для классов-наследников. А производные классы уже реализуют этот функционал. При определении абстрактных классов используется ключевое слово abstract: abstract class Employee { } C# 1 2 3
  • 4. Абстрактные классы 4Емельянов В.А.: Объектно-ориентированное программирование Кроме обычных методов абстрактный класс может содержать абстрактные методы. Такие методы определяются с помощью ключевого слова abstract и не имеют никакого функционала: abstract class Employee { private String name; public String getName() //обычный метод { return name; //реализация функционала обычного метода } public abstract void GiveBonus(float amount); //абстрактный метод } C# 1 2 3 4 5 6 7 8 9 10 11 12 13
  • 5. Абстрактные классы 5Емельянов В.А.: Объектно-ориентированное программирование Особенности:  производный класс обязан переопределить и реализовать все абстрактные методы, которые имеются в базовом абстрактном классе;  если класс имеет хотя бы один абстрактный метод, то данный класс должен быть определен как абстрактный.  производный класс в котором не будет замещен абстрактный метод сам считается абстрактным, и мы не сможем создавать объекты этого класса.
  • 6. Ограничения наследования от классов 6Емельянов В.А.: Объектно-ориентированное программирование В современных языках программирования (Java, C#, PHP и др.) наследовать можно только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.
  • 7. Интерфейсы 7Емельянов В.А.: Объектно-ориентированное программирование Назначение:  Интерфейс описывает поведение, которое конкретный класс может выбрать для реализации.  Класс может при необходимости поддерживать много интерфейсов, тем самым поддерживая множество стилей поведения. Чтобы определить интерфейс, используется ключевое слово interface: interface IMovable { } C# Интерфейс (interface) – именованный набор абстрактных членов 1 2 3
  • 8. Интерфейсы 8Емельянов В.А.: Объектно-ориентированное программирование Особенности интерфейса:  Все методы интерфейса не имеют модификаторов доступа, но фактически по умолчанию доступ public, так как цель интерфейса - определение функционала для реализации его классом. Поэтому весь функционал должен быть открыт для реализации.
  • 9. Интерфейсы 9Емельянов В.А.: Объектно-ориентированное программирование interface IMovable { void Move(); } class Animal : IMovable { public void Move() { //код для реализации передвижения животного } } class Human : IMovable { public void Move() { //код для реализации передвижения человека } } C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
  • 10. Различия абстрактного класса и интерфейса 10Емельянов В.А.: Объектно-ориентированное программирование
  • 11. Когда следует использовать абстрактные классы? 11Емельянов В.А.: Объектно-ориентированное программирование  Если необходимо определить общий функционал (поведение) для родственных объектов  Если проектируем довольно большую функциональную единицу, которая содержит много базового функционала  Если необходимо, чтобы все производные классы на всех уровнях наследования имели некоторую общую реализацию Если надо будет поменять название или параметры метода интерфейса, то придется вносить изменения и во все классы, которые данный интерфейс реализуют. С абстрактными классами, если надо изменить базовый функционал во всех наследниках, то достаточно поменять его в абстрактном базовом классе.
  • 12. Когда следует использовать интерфейсы? 12Емельянов В.А.: Объектно-ориентированное программирование  Если необходимо определить функционал для группы разрозненных объектов, которые могут быть никак не связаны между собой  Если проектируем небольшой функциональный тип
  • 13. Пример использования абстрактных классов 13Емельянов В.А.: Объектно-ориентированное программирование Задача: Пусть есть система транспортных средств: легковой автомобиль, автобус, трамвай, поезд и т.д. Поскольку данные объекты являются родственными, мы можем выделить у них общие признаки, то в данном случае можно использовать абстрактные классы: C# public abstract class Vehicle { public abstract void Move(); } public class Car : Vehicle { public override void Move() { Console.WriteLine("Машина едет"); } } public class Bus : Vehicle { public override void Move() { Console.WriteLine("Автобус едет"); } } public class Tram : Vehicle { public override void Move() { Console.WriteLine("Трамвай едет"); } } 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
  • 14. Пример использования интерфейса 14Емельянов В.А.: Объектно-ориентированное программирование Задача: Предположим, что система транспорта не ограничивается вышеперечисленными транспортными средствами. Например, можно добавить самолеты, лодки. Можно добавить лошадь - животное, которое может также выполнять роль транспортного средства. Т.е. получается широкий круг объектов, которые связаны только тем, что являются транспортным средством и должны реализовать метод Move(), выполняющий перемещение. Решение: Так как объекты малосвязанные между собой, то для определения общего для всех них функционала лучше определить интерфейс. Тем более некоторые из этих объектов могут существовать в рамках параллельных систем классификаций. Например, лошадь может быть классом в структуре системы классов животного мира.
  • 15. Пример использования интерфейса 15Емельянов В.А.: Объектно-ориентированное программирование C# public interface IMovable { void Move(); } public abstract class Vehicle { } public class Car : Vehicle, IMovable { public void Move() { Console.WriteLine("Машина едет"); } } public class Bus : Vehicle, IMovable { public void Move() { Console.WriteLine("Автобус едет"); } } public class Hourse : IMovable { public void Move() { Console.WriteLine("Лошадь скачет"); } } public class Aircraft : IMovable { public void Move() { Console.WriteLine("Самолет летит"); } } 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
  • 16. Заключение 16Емельянов В.А.: Объектно-ориентированное программирование  абстрактные классы фокусируются на общем состоянии классов-наследников, т.е. для одноплановых классов, которые имеют общее состояние, лучше определять абстрактный класс.  интерфейсы строятся вокруг какого-либо общего действия. Если разноплановые классы обладают каким-то общим действием, то это действие лучше выносить в интерфейс.