
- •Программирование и алгоритмические языки. Курс за третий семестр.
- •Введение в объектно-ориентированное программирование (ооп)
- •Идеологический обзор
- •Базовые принципы ооп
- •Наследование имён. Наследование значений.
- •Коллизия
- •Что такое имя процедуры?
- •Ооп как оперирование типами
- •Именование типов в c# Тип данных «класс»
- •Конструкторы и деструкторы
- •И нкапсуляция данных
- •Наследование (краткое введение)
- •Наследование реализации как уточнение семантики типа
- •Пополнение и переопределение методов Отношение пополнения интерфейса
- •Открытие реализации для проектирования классов - опция protected
- •Полиморфизм Полиморфизм как уточнение семантики типа переменной
- •Динамические методы как поддержка полиморфизма- опции static, virtual, override
- •Событийное программирование Обработка событий
- •Идея: Когда что-то вставляется, срабатывает некоторый предикат. Например, после вызывается команда проверки, каскадного удаления или какая-нибудь другая команда. Генераторы и приёмники сообщений
- •Событийное программирование нужно:
- •Событийный стиль в процедурном программировании - управление данными (на примере)
- •Событийное программирование в c# (delegate, event)
- •Введение в компонентное программирование
- •Объекты, реализующие интерфейсы
- •Частный случай общей проблемы взаимодействия программного обеспечения разных производителей на уровне исполняемого кода
- •Базовый интерфейс компонент
- •Проблема множественности иерархий
- •Коллизия имён
- •Коллизия реализации
- •«Симметричное» решение – агрегаты (декартовы произведения классов)
- •Множественное наследование
- •«Асимметричное» решение - именованные интерфейсы
- •Основные отличия интерфейса и абстрактного класса
- •Наследование интерфейса (компонентный подход)
- •Обработка исключений в ооп
- •Определение и генерация исключений в c#
- •Выбрасывание исключений
- •Захват исключения
- •Блок finally
- •Коды программ
Наследование имён. Наследование значений.
Тип наследования имён - самый простой тип наследования.
Семантика модулей:
Все имена описанные в uses доступны в D так, если бы они были описаны в D. Когда мы ссылаемся на модуль, мы получаем возможность использования тех публичных имён, которые там написаны.
Это и есть наследование имён в том смысле, что к определяемым именам добавляются определения новых имён.
Uses в модульном программировании – наследование (добавление), определение новых имён. Можно непосредственно использовать функции из тех модулей, на которые ссылаемся, а можно при определении новых имён использовать эти функции (т.е. определяется новая процедура и вызывается процедура из другого модуля).
Коллизия
Коллизия подразумевает то, что одно и то же имя определяется по-разному.
С помощью квалифицированных имён можно избавиться от коллизии.
Если имя неквалифицированное (просто f), то имеется в виду ближайшее определение процедуры.
Вспомним понятие области действия:
Если какая-то переменная описана там и здесь (и ничего больше не сказано), то в данном случае выбирается ближайшее определение.
Если нужно указать определённую функцию из какого-нибудь модуля, нужно осуществить указание на тот модуль, где находится данная функция.
Например, М.f, где М- название модуля, а f- функция.
Замечание: можно ли определять одинаковые имена на одном уровне в одном модуле?
-В процедурном программировании это было категорически запрещено.
-В модульном программировании чуть-чуть иначе.
Что такое имя процедуры?
а) A*B R*R->R (функция от двух переменных) , где R –вещественные числа
(1 аргумент = вещественный)*(2 аргумент = вещественный)->(результат =вещественный))
n
б) П ai R*->R, где R*- последовательность
i=1
((1 аргумент =последовательность)->(результат =вещественный))
а) и б)- две разные функции, т.к. у них разные типы
Соглашение:
Можно использовать одинаковые имена процедур и функций на одном уровне, если у них разный список параметров.
Итак:
-имена функций являются одинаковыми, если у них заголовки в точности идентичны;
-если имя функций одно, а параметры разные, то эти функции считаются разными;
Это по-другому называется override – перегрузка (переопределение).
Override - добавление новых имён с учётом регулировки коллизий и синтаксических соглашений.
Тот же вид наследования возможен и в ООП, но наследование здесь не множественное, не кратное. Иначе говоря, каждый тип или класс может ссылаться лишь на одного предка.
Это не отражает всю сложность реальности.
Тип данных -> Модуль-> Класс
Ооп как оперирование типами
В объектно-ориентированном программировании типы рассматриваются как значения.
Структура модульного программирования - произвольный граф без циклов.
Структура ООП - дерево.
Манипуляция над типами производится при помощи именования типов.
Заметим, что:
-В процедурном программировании понятие типа сильно ориентировано на значения. Классификация типов производится по области значений и именуются области значений, а не var.
-Модульное программирование допускает именование типа, если отождествлять модуль с реализацией типа (в реальности ни синтаксис, ни общепринятая практика не связывают понятие модуля с понятием типа).
Замечание:
Модуль можно трактовать как определение нескольких типов. Можно сказать, что модуль- библиотека, т.е. произвольный набор определённых значений и преобразований.
- В объектно-ориентированном программировании типы рассматриваются как
значения.
Краткий синтаксис языка C#
Using System;
Namespace [имя_приложения]
{
…
// описание тех классов, которые используем
Class [имя класса]
{
}
…
Class Program
{
// основная программа- запускалка
static void Main()
}
}
System - стандартная библиотека- ввод-вывод, базовые классы.
Директива Using позволяет обращаться к членам пространства имён напрямую (без использования полного имени).
Замечание: при необходимости можно подключить другие библиотеки
Как мы знаем, каждое приложение должно начинаться с какого-то оператора. Несмотря на то, что в приложении может быть много классов, точка входа всегда одна. В C# при запуске приложения начинает выполняться метод Main.
Namespace - логически связанное определение имён. Пространства имён (Namespace) предоставляют возможность логичной взаимосвязи классов и других типов.