close

Вход

Забыли?

вход по аккаунту

код для вставкиСкачать
26.03.2014
Программирование
(структурное, процедурное,
объектно-ориентированное)
с использованием C++/C#
Полевой Дмитрий Валерьевич
к.т.н., доцент КиК
e-mail: [email protected]
1
26.03.2014
Базовые принципы ООП
0. абстракция
1. инкапсуляция
сокрытие
пользовательские типы данных
2. наследование
3. полиморфизм
перегрузка функций
«шаблонный» код (generics, templates)
виртуальный вызов
12.03.2014
2
2
26.03.2014
Повторное использование кода
• уменьшение “стоимости” создания и
поддержки ПО
– разработка
– отладка и тестирование
– сопровождение
– модификация
• эффекты “массовости”
12.03.2014
3
3
26.03.2014
Реализация повторного использования
кода
• модульность – использование готовых
компонент (классы, библиотеки)
• создание новых классов на основе
существующих
– включение
– наследование
– инстанциирование (шаблоны)
12.03.2014
4
4
26.03.2014
Инкапсуляция
• интерфейс – поведение
• состояние – данные
• разделение интерфейса и реализация
• сокрытие деталей реализации
12.03.2014
5
5
26.03.2014
Сокрытие
• принцип проектирования
• разграничение доступа (к внутренностям)
• поддержка на уровне языка (типы)
• «практики» использования
12.03.2014
6
6
26.03.2014
Сокрытие (зачем)
• борьба со сложностью изменений
– локализация изменений
– предсказания изменений и их последствий
• «очистка» глобальной области видимости
• защита от «проблем интеграции»
12.03.2014
7
7
26.03.2014
Сокрытие (как)
• использование модификаторов доступа
• использование интерфейсов
– аккуратное проектирование
– достаточная декомпозиция (простые сущности)
– соглашения и документирование
– прикладной код «через интерфейсы»
– языковые средства (например, Interface)
12.03.2014
8
8
26.03.2014
Перегрузка методов
• полиморфизм – использование одного
имени для операций с разными типами
пример:
public
{…}
public
{…}
public
{…}
public
{…}
12.03.2014
Point()
Point(Point p)
Point(Double x, Double y)
Point(Double x, Double y, Double z)
9
9
26.03.2014
Разрешение вызова
• перегруженный метод
• список параметров
• допустимые (неявные) преобразования
• правила поиска однозначного соответсвия
12.03.2014
10
10
26.03.2014
Проблема повторного использования
алгоритмов
• один и тот же алгоритм может
обрабатывать данные разных типов
пример:
Int32
minimum(Int32 lhs, Int32 rhs)
{
return (lhs < rhs) ? lhs : rhs;
}
12.03.2014
11
11
26.03.2014
Как использовать алгоритм
с разными типами?
• «copy-past»
– размножение “одинаковых сущностей” и
внесение новых ошибок
– усложнение поддержки кода
• однокорневая иерархия (C#, С++)
• макрос (C++)
– отсутствие проверки типа при компиляции
– усложнение отладки и поддержки
12.03.2014
12
12
26.03.2014
Тип, как параметр (generics)
• «шаблонный» код (<T>)
– использовать алгоритм/тип с разными типами
• пишется в терминах указанных типов
• проверяется для указанных ограничений
• типы-параметры
– выводятся автоматически
– указываются в коде
12.03.2014
13
13
26.03.2014
Шаблонный метод (пример)
static T minimum<T>(T lhs, T rhs)
{
return (lhs < rhs) ? lhs : rhs;
}
…
T.minimum(a, b);
12.03.2014
14
14
26.03.2014
Шаблонный тип (пример)
public struct
Point<T>
{
public T x_;
public T y_;
}
12.03.2014
Point<Int32> point;
point.x_ = 1;
point.y_ = 2;
Point<Double> pF;
pF.x_ = 1.2;
pF.y_ = 3.4;
15
15
26.03.2014
Слабая типизация
• тип обеспечивает интерфейс, ожидаемый
шаблоном
• требуется доступность вызываемых
функций для типов, параметризующих
шаблоны
12.03.2014
16
16
26.03.2014
Перегрузка методов и шаблоны
• можно объявлять
– несколько шаблонов с одним именем
– комбинацию шаблонов и обычных методов с
одним именем
• выбор метода
– разрешение вызова
– явный квалификатор (параметры шаблона)
12.03.2014
17
17
26.03.2014
Идея
• программа моделирует реальность
• типы моделируют концепции реального и
программного мира
• существуют отношения концепций
• язык поддерживает моделирование
концепций и некоторых типов отношений с
помощью пользовательских типов
12.03.2014
18
18
26.03.2014
Композиция (отношение «has a»)
• способ создания новых классов
• новый класс включает поля существующих
типов (классов)
пример:
человек имеет имя, дату рождения, пол
12.03.2014
19
19
26.03.2014
Композиция (пример)
struct Man
{
String name_;
String secname_;
}
12.03.2014
20
20
26.03.2014
Наследование (отношение «is a»)
• способ создания новых классов
• позволяет явно отражать общность классов
(новый класс наследует члены)
пример:
студент является человеком
12.03.2014
21
21
26.03.2014
Понятия иерархии наследования
• базовый (родительский) тип
• производный (дочерний) тип
• множественное наследование –
наследование от нескольких базовых типов
12.03.2014
22
22
26.03.2014
Наследование (пример)
struct Man
{
String name_;
String secname_;
}
12.03.2014
struct Student :
Man
{
Group group_;
}
23
23
26.03.2014
Наследование (зачем)
• повторное использование (расширение)
– данных (минимизировать)
– методов (абстрагировать до интерфейсов)
• для использования полиморфизма
12.03.2014
24
24
26.03.2014
Подстановочный критерий
(нестрогая формулировка)
• в любой точке вызова базового класса м.б.
использован производный класс
или
• любой экземпляр производного класса
является допустимым экземпляром
родительского класса
12.03.2014
25
25
26.03.2014
Наследование (ограничения)
• для структур
– запрещено
– возможна реализация нескольких интерфейсов
• для классов
– запрещено множественное
– возможна реализация нескольких интерфейсов
12.03.2014
26
26
26.03.2014
Интерфейс (interface)
• «являться» = «вести себя как»
• содержит только сигнатуры
– методов
– свойств
– индексаторов
– событий
• реализующий тип (структура, класс) должен
реализовать члены интерфейса
12.03.2014
27
27
26.03.2014
Интерфейс (пример)
interface IEquatable<T>
{
Boolean Equals(T obj);
}
public class Man : IEquatable<Man>
{
…
public Boolean Equals(Man man)
{
return (name_ == man.name_);
}
}
12.03.2014
28
28
26.03.2014
Вызов конструктора «родителя»
• возможен в конструкторе «ребенка» (base)
пример:
class B : A
{
public B()
: base()
{
…
}
}
12.03.2014
29
29
26.03.2014
Абстрактные типы и члены (abstract)
• запрет создания экземпляра
• применим к
– класс
– метод
– свойство
– индексатор
– событие
• должно иметь реализацию в дочерних
12.03.2014
30
30
26.03.2014
Полиморфный метод
• virtual в родительском классе
• может быть переопределен в дочернем
классе с помощью override
• исполняемый код определяется в момент
вызова
12.03.2014
31
31
26.03.2014
Переменные в иерархии
(наследования)
class B : A
{
override public void f()
{…}
…
}
A a = new B;
a.f();
12.03.2014
32
32
26.03.2014
Допустимость переопределения
• нельзя использовать virtual с
– static
– abstract
– private
– override
12.03.2014
33
33
26.03.2014
Однокорневая иерархия
System.Object
• базовый тип для всех типов
– корень иерархии наследования
• может хранить значения любых типов
– для типов-значений упаковка-распаковка
12.03.2014
34
34
26.03.2014
Печать в консоль (ToString)
// in Object
public virtual String ToString()
• можно переопределить ToString
• вызывается «внутри»
Console.Write
Console.WriteLine
12.03.2014
35
35
26.03.2014
Интерфейсы (стандартные)
public struct Int32
: IComparable
, IFormattable
, IConvertible
, IComparable<Int32>
, IEquatable<Int32>
12.03.2014
36
36
26.03.2014
«Сравнимые» (IComparable)
public interface IComparable
{
public Int32 CompareTo(Object obj);
}
меньше
нуля
данный экземпляр в порядке сортировки следует
перед obj
ноль
данный экземпляр имеет ту же позицию, что и obj
больше
нуля
данный экземпляр в порядке сортировки следует
после obj
12.03.2014
37
37
26.03.2014
«Сравнимые» (IComparable<T>)
public interface IComparable<T>
{
public Int32 CompareTo(T obj);
}
меньше
нуля
данный экземпляр в порядке сортировки следует
перед obj
ноль
данный экземпляр имеет ту же позицию, что и obj
больше
нуля
данный экземпляр в порядке сортировки следует
после obj
12.03.2014
38
38
26.03.2014
АТД
• абстрактный тип данных
– создание/уничтожение
– набор операций
• структура данных
– реализация АТД
– способ организации в памяти
12.03.2014
39
39
26.03.2014
Структура данных (пример)
•
•
•
•
массив
список
дерево
граф
12.03.2014
40
40
26.03.2014
Класс
• может иметь инвариант
• реализует одну или несколько абстракций
• интерфейс (класса)
– открытые методы
– семантическая и синтаксическая конструкция
– спецификация услуг
• закон “протекающих абстракций”
12.03.2014
41
41
26.03.2014
АТД “число”
• создание
• уничтожение
• присваивание
• сравнение
==, !=, <, <=, >, >=
• арифметические операции
-, +=, +, -=, -, *=, *, /=, /
• ввод и вывод
12.03.2014
42
42
26.03.2014
АТД «массив»
(фиксированный размер)
• создание
• уничтожение
• присваивание
• получение доступа к элементу по индексу
• получение размера
12.03.2014
43
43
26.03.2014
АТД «динамический массив»
• создание
• уничтожение
• присваивание
• получение доступа к элементу по индексу
• получение размера
• изменение размера
12.03.2014
44
44
1/--страниц
Пожаловаться на содержимое документа