
- •Лекция 1. Введение. Платформа .Net. Среда Visual Studio.Net. Консольные приложения
- •Платформа .Net
- •Среда Visual Studio.Net
- •Консольные приложения
- •Заготовка консольной программы
- •Вопросы для самоконтроля
- •Лекция 2. Основные понятия языка Алфавит и лексемы
- •Алфавит с# включает:
- •Идентификаторы
- •Ключевые слова
- •Знаки операций и разделители
- •Литералы
- •Лекция 3. Типы данных с#. Переменные, операции, выражения
- •Встроенные типы
- •Типы-значения и ссылочные типы
- •Упаковка и распаковка
- •Переменные
- •Пример описания локальных переменных
- •Именованные константы
- •Операции и выражения
- •Преобразования встроенных арифметических типов-значений
- •Явное преобразование типа
- •Основные операции с#
- •Решение дз
- •Математические функции – класс Math
- •Лекция 5. Операторы языка c#
- •Блок или составной оператор
- •Пустой оператор
- •Операторы выбора (ветвления)
- •Оператор if
- •If(выражение_1) оператор_1;
- •If(выражение1) if(выражение2) if(выражение3) ...
- •Примеры оператора if:
- •Следует избегать проверки ве5щественных величин на равенство, вместо этого лучше сравнивать модуль их разности с некоторым малым числом:
- •Оператор switch (переключатель)
- •Операторы перехода
- •Оператор goto
- •Операторы break и continue
- •Оператор return
- •Лекция 6. Операторы цикла
- •Цикл с предусловием while
- •While ( выражение ) оператор
- •Цикл с постусловием do
- •Do оператор while выражение;
- •Цикл с параметром for
- •Цикл перебора foreach
- •Рекомендации по выбору оператора цикла
- •Лекция 7. Массивы
- •Одномерные массивы
- •Прямоугольные массивы
- •Класс System.Array
- •Оператор foreach для работы с массивами
- •Примеры обработки массивов с использованием класса Array
- •Лекция 8. Строки
- •Работа с символами в с#
- •Массивы символов
- •Строки типа string
- •Операции над строками
- •Форматирование строк
- •Пользовательские шаблоны форматирования
- •Строки типа StringBuilder
- •Лекция 9. Класс Random. Функции в языке с#
- •Функции (методы) в языке с#
- •Способы обмена информацией
- •Параметры-значения
- •Параметры-ссылки
- •Выходные параметры
- •Модифицированный пример применения выходных параметров
- •Лекция 10. Указатели в языке с# Небезопасный код
- •Синтаксис указателей
- •Указатель void
- •Преобразование указателей
- •Инициализация указателей
- •Арифметические операции с указателями
- •Приоритетность выполнений операций с указателями
- •Указатель на указатель
- •Операция stackalloc
- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
- •Лекция 12. Структуры и перечисления в языке с#
- •Перечисления
- •Операции с перечислениями
- •Базовый класс System.Enum
- •Рекомендации по программированию
- •Пример программы с использованием структур с методами и перечислений
- •Лекция 13. Основные понятия ооп. Классы.
- •Данные: поля и константы
- •Виды элементов класса
- •Лекция 13_часть 2. Ооп. Члены класса. Основные свойства ооп
- •Члены класса
- •Свойства и поля
- •Конструкторы
- •Деструкторы
- •Статические члены класса и члены класса экземпляра
- •Интерфейсы
- •Основные свойства ооп
- •3. Полиморфизм
- •Упражнения к лекции
- •Решение дз
- •Лекция 14. Конструкторы. Параметр this. Ключевое слово this
- •Конструкторы
- •Конструкторы класса (статические конструкторы)
- •Класс “ Monster”
- •Свойства класса
- •Рекомендации по программированию
- •Лекция 15. Наследование. Виртуальные функции. Сокрытие методов базового класса. Абстрактные и закрытые классы Наследование
- •Особенности поведения конструкторов при наследовании
- •Пример программы иерархии наследования с использованием конструкторов
- •Синтаксис объявления наследования
- •Виртуальные методы
- •Правила использования виртуальных методов
- •Сокрытие методов базового класса
- •Вызов переопределенных или скрытых методов базового класса
- •Абстрактные классы и функции
- •Правила работы с абстрактными классами и методами:
- •Пример использования абстрактного класса
- •Закрытые (изолированные) классы и методы
- •Лекция 16. Интерфейсы. Использованием интерфейсов
- •Пример описания, реализации и использования интерфейса
- •Void Draw(); //простой метод вывода имени монстра
- •Int Attack(int a); //реализация атаки с заданной силой
- •Void Die(); // метод вывода на экран сообщения о смерти монстра
- •Int Power { get; } //свойство, вычисляющее силу монстра
- •Лекция 17. Семейства. Индексаторы
- •Пример использования семейства System.Collections.ArrayList
- •Определение собственных семейств
- •Индексаторы
- •Пример с использованием собственного семейства
- •Семейства с доступом по ключу и интерфейс iDictionary
- •Индексаторы и пользовательские классы
- •Лекция 18. Перегрузка методов и операций в классах Перегрузка методов
- •Перегрузка операций
- •Перегрузка унарных операций
- •Пример перегрузки унарных операций на примере класса
- •Перегрузка бинарных операций
- •Public static тип_возвр_знач operator бинарная_операция (параметр1, параметр2),
- •Пример перегрузки бинарных операций на примере класса
- •Класс System.Object
- •Пример перегрузки операций сравнения с использованием стандартных методов класса Object
- •Лекция 19. Стандартные интерфейсы. Клонирование. Итераторы Стандартные интерфейсы .Net
- •Сравнение объектов (интерфейс iComparable)
- •Пример использования стандартного интерфейса iComparable на примере класса Monster
- •Сортировка объектов по различным критериям (интерфейс iComparer)
- •Пример использования стандартного интерфейса iComparer на примере класса Monster
- •Клонирование объектов (интерфейс iCloneable)
- •Перебор элементов (интерфейс iEnumerable) и итераторы
- •Пример работы класса с итератором
- •Примеры применения простейших итераторов
- •Лекция 20, 21. Делегаты и события
- •Пример делегата для обычной функции
- •Пример делегата для метода класса
- •1.Делегат для выбора методов на этапе выполнения
- •Delegate.Invoke или что там внутри? (для продвинутых)
- •Пример делегата для работы с несколькими методами
- •2. Делегат как оповещатель. Паттерн «наблюдатель»
- •Пример делегата для оповещения наблюдателей
- •3. Делегат как процедура обратного вызова
- •Пример передачи делегата в качестве параметра функции
- •4.Делегат, как обработчик событий
- •[Cпецификаторы] event тип делегата имя события, где
- •Пример делегата для оповещения наблюдателей с помощью событий
- •Стандартные делегаты
- •Пример стандартного делегата EventHandler для оповещения наблюдателей с помощью событий
- •Лекция 21. Сборки, библиотеки, атрибуты, директивы. Сборка
- •Создание собственной библиотеки
- •Пример создания и использования собственной библиотеки
- •Рефлексия
- •Пример применения рефлексии
- •Атрибуты
- •Пространство имён
- •Директивы препроцессора
- •Пример использования директив препроцессора
- •Лекция 22. Классы прототипы, параметризованные коллекции
- •Создание класса-прототипа
- •//При использовании класса-прототипа вместо параметра т подставляется //конкретный тип данных
- •Ограничения
- •Обобщенные методы
- •Преимущества использования параметризованных классов и методов:
Интерфейсы
Интерфейсом называется семейство явно описанных как public - методов и свойств, которые сгруппированы в единое целое и инкапсулируют какую-либо определенную функциональную возможность.
После того как интерфейс определен, его можно реализовать в некотором классе. Это означает, что класс будет поддерживать все свойства и члены, определяемые данным интерфейсом. Обратите внимание, что интерфейсы не могут существовать сами по себе. Нельзя "создать экземпляр интерфейса" таким же образом, как создается экземпляр класса. Кроме того, интерфейс не может содержать в себе никакого кода, который бы реализовал его члены; он просто описывает эти члены. Их реализация должна находиться в классах, в которых реализован данный интерфейс.
В предыдущем примере, касающемся кофе, можно сгруппировать в интерфейс несколько свойств и методов наиболее общего назначения, например, AddSugar(), Milk (молоко), Sugar (сахар) и Instant (растворимый). Такой интерфейс можно назвать как-нибудь вроде IHotDrink (горячий напиток) - (имена интерфейсов обычно предваряются заглавной буквой i). Этот интерфейс допустимо использовать и для каких-нибудь других объектов, возможно, принадлежащих к классу CupOfTea (чашка чая). Другими словами, получается возможность обращаться с этими объектами одинаковым образом, а они при этом по-прежнему могут обладать своими собственными индивидуальными свойствами (например, сорт кофейных бобов (Marka) для класса CupOfCoffee и сорт чайного листа (MarkaTea) для класса CupOfTea).
Интерфейсы, реализованные на объектах UML, изображаются с помощью "леденцового" синтаксиса. На диаграмме, приведенной на рисунке 13.5 слева, члены IHotDrink выделены в отдельный прямоугольник с помощью синтаксиса, напоминающего используемый для описания классов.
CupOfCoffee |
+Marka:
string |
|
<<Interface>> IHotDrink |
+Instant: bool +Milk: bool +Sugar: bool -Description: string |
+AddSugar(in amount: byte): byte |

CupOfTea |
+MarkaTea:
string |
|
IHotDrink
Рисунок 13.5 – UML-представление интерфейсов
У класса может быть несколько интерфейсов, и несколько классов могут поддерживать один и тот же интерфейс. Понятие интерфейса позволяет, таким образом, облегчить жизнь другим разработчикам и пользователям. Допустим, что у вас имеется некий код, в котором задействован объект, обладающий определенным интерфейсом. Если предположить, что вы не используете другие свойства и методы данного объекта, то появляется возможность заменять один объект на другой(код, в котором используется интерфейс IHotDrink, может работать как с экземпляром класса CupOfCoffee, так и с экземпляром класса CupOfTea). Кроме того, разработчик самого объекта имеет возможность снабжать вас усовершенствованными версиями этого объекта — если он поддерживает использовавшийся ранее интерфейс, то не составит никакого труда применить новую версию объекта в вашей программе.
Основные свойства ооп
Основными свойствами ООП являются инкапсуляция, наследование и полиморфизм. Кратко рассмотрим каждое из свойств.
1. Инкапсуляция – способность прятать детали реализации объектов от пользователей этих объектов. Например, предположим, что создан класс с именем DBReader (для работы с базой данных), в котором определено два главных метода: Ореn() и Close(). Класс DBReader скрывает за счет инкапсуляции подробности открытия и закрытия баз данных.
DBReader f = new DBReader();
f.Open(@"C:\foo.mdf ");
//Выполнение с базой данных необходимых действий
f.Close();
Класс DBReader инкапсулирует внутренние подробности того, как именно он обнаруживает, загружает, выполняет операции и закрывает файл базы данных.
За счет инкапсуляции программирование становится проще: нет необходимости беспокоиться об огромном количестве строк кода, которые выполняют свою задачу скрыто от разработчика. Все, что требуется от программиста — создать экземпляр нужного класса и передать ему необходимые сообщения (типа “открыть файл с именем foo.mdf”).
С философией инкапсуляции тесно связан еще один принцип — сокрытия всех внутренних данных (то есть переменных-членов) класса. Все внутренние переменные члены класса должны быть определены как private. В результате обращение к ним из внешнего мира будет возможно только при помощи открытых функций — членов. Такое решение, помимо всего прочего, защищает программиста от возможных ошибок, поскольку открытые данные очень просто повредить.
2. Наследование является одной из наиболее важных особенностей ООП. Любой класс может наследоваться от другого класса, что означает, что он будет обладать всеми членами того класса, от которого он наследуется. В терминологии ООП класс, от которого происходит наследование, называется базовым классом, класс, который наследуется, называется производным классом. В С# все объекты происходят от единственного базового класса. Наследование позволяет расширять или создавать более специфические классы на основе одного базового класса System.Object.
Например, представьте себе класс, описывающий домашнее животное. Этот класс можно назвать Animal (животное) и включить в него такой метод, как EatFood() (принимать пищу). После этого можно создать производный класс с именем Cow (корова), который будет поддерживать метод EatFood(), но при этом может обладать и своими собственными, например, Mоо() (мычать) и SupplyMilk() (давать молоко). Можно создавать и другие производные классы, например, класс Chicken (курица) с методами Cluck() (кудахтать) и LayEgg() (нести яйца).
В UML наследование изображается с помощью стрелок (рисунок 13.6). Здесь для краткости опущены члены, обладающие возвращаемыми значениями.
Animal |
|
+EatFood() |
Chicken |
|
+ Cluck() +LayEgg() |
Cow |
|
+ Moo() +SupplyMilk() |
Рисунок 13.6 – UML-представление наследования
При наследовании от одного базового класса возникает очень важный вопрос о режиме доступа к членам данного класса. Частные члены базового класса, в отличие от общих членов, доступны не будут. Однако общие члены будут доступны как производному классу, таки внешнему коду. Это означает, что при использовании только этих двух режимов доступа мы не можем получить член, который был бы доступен базовому классу и производному классу, но не был бы при этом доступен для внешнего кода. Для решения этой проблемы вводится третий режим доступа — protected (защищенный), при котором доступ открыт только для производных классов.