- •Об’єктно-орієнтоване програмування
- •Содержание
- •Тема 1. Понития ооа, ооПр и ооп Лекция 1. Объектная модель и принципы ее организации
- •1. Понития ооа, ооПр и ооп и их отличия от подходов структурного проектирования
- •2. Основные понятия ооп
- •Тема 2. Основы программирования на языке с# .Net Лекция 2. Введение в программирование на с# .Net
- •1. Роль платформы .Net
- •2. Первая программа на c# и основные приемы работы в системе ms Visual Studio
- •3. Структура программы
- •4. Собственные пространства имен
- •Лекция 3. Система типов данных языка с#
- •1. Система типов данных языка с#
- •2. Преобразование типов
- •Лекция 4. Выражения и операторы языка с#
- •1. Выражения
- •2. Операторы
- •2.1. Операторы ввода и вывода
- •2.2. Операторы ветвления
- •2.3. Операторы цикла
- •2.3. Оператор безусловного перехода
- •Лекция 5. Массивы
- •1. Основные понятия
- •2. Одномерные массивы
- •3. Многомерные массивы
- •4. Класс Array
- •5. Класс Random
- •Лекция 6. Структуры и перечисления
- •1. Структуры
- •3. Перечисления
- •Лекция 7. Символы и строки
- •1. Символы char
- •2. Неизменяемые строки string
- •3. Изменяемые строки
- •Лекция 8. Файловая система
- •1. Основные сведения
- •2. Работа с каталогами
- •2.1. Абстрактный класс FileSystemInfo
- •2.2. Класс DirectoryInfo
- •2.3. Класс Directory
- •3. Работа с файлами
- •3.1. Класс Filelnfo
- •3.2. Класс File
- •Тема 3. Принципы парадигмы объектно-ориентированного программирования Лекция 9. Пронципы объектно-ориентированного программирования
- •1. Основные понятия
- •2. Роль инкапсуляции
- •3. Роль наследования
- •4. Роль полиморфизма
- •Лекция 10-11. Классы и объекты
- •1. Основные понятия
- •2. Функциональные элементы класса
- •2.1. Данные: поля и константы
- •2.2. Методы
- •2.3. Конструкторы
- •2.4. Деструкторы
- •2.5. Свойства
- •2.6. Индексаторы
- •3. «Один класс – один файл»
- •Лекция 12-13. Класы коллекций
- •1. Основные понятия
- •2. Класс Stack
- •3. Класс Queue
- •4. Класс ArrayList
- •Тема 4. Инкапсуляция и скрытие информации Лекция 14. Инкапсуляция как средство структурирования систем
- •1. Основные понятия
- •2. Основная концепция инкапсуляции
- •Тема 5. Перегрузка операторов и функций Лекция 15. Модификатор доступа переменных и функций
- •1. Основные понятия
- •2. Примеры использования модификаторов доступа
- •Лекция 16. Перегрузка операторов и функций
- •1. Операции класса
- •2. Унарные операции
- •3. Бинарные операции
- •4. Операции преобразования типов
- •Implicit operator целевой_тип (параметр) //неявное преобразование
- •Тема 6. Наследование и полное использование кода Лекция 17. Основы наследования
- •1. Иерархия классов
- •2. Основы наследования
- •3. Использование защищенного доступа
- •Лекция 18. Вызов базового конструктора
- •1. Наследование конструкторов
- •2. Вызов базового конструктора
- •Тема 7. Многоуровневое наследование. Конфликт имен и потоков классов Лекция 19-20. Многоуровневое наследование и его недостатки
- •1. Многоуровневая иерархия
- •2. Переменные базового класса и производного класса
- •3. Виртуальные методы
- •4. Абстрактные методы и классы
- •Лекция 21. Классы потоков вводв и вывода
- •1. Основные понятия
- •2. Стандартный поток ввода
- •3. Стандартный поток вывода
- •4. Стандартный поток вывода сообщений об ошибках
- •5. Программа StdStreams
- •Лекция 22. Классы потоков для работы с файлами, памятью и сетью
- •1. Класс BufferedStream
- •2. Класс FileStream
- •3. Класс MemoryStream
- •4. Класс NetworkStream
- •5. Класс CryptoStream
- •Тема 8. Полиморфизм и виртуальные функции Лекция 23. Основы полиморфизма и преимущества его использования
- •1. Основы полиморфизма
- •2. Преимущества использования полиморфизма
- •Лекция 24. Динамическое связывание виртуальных методов
- •1. Виртуальные методы
- •2. Вызов базового метода
- •Тема 9. Интерфейсы Лекция 25. Интерфейсы
- •1. Основные понятия
- •2. Пример опредиления интерфейса и работы с ним
- •Лекция 26. Стандартные интерфейсы .Net
- •1. Стандартный интерфейс iComparable
- •2. Перегрузка операций отношения с помощью метода CompareTo
- •3. Стандартные интерфейсы iEnumerable и iEnumerator
- •Тема 10. Объектно-ориентированное программирование Windows-приложений на основе WindowsForms Лекция 27-28. Библиотеки классов реализации функциональных возможностей Windows
- •1. Формы
- •6. Компиляция программы
- •7. События в Windows-приложениях
- •7.1. События мыши
- •Лекция 29. Разработка графических интерфейсов пользователя
- •1. Общтие сведения
- •2. Группы элементов управления
- •Лекция 30-31. Работа с даннями
- •1. Что такое реляционная база данных?
- •2. Модель объектов ado.Net
- •3. Подготовка ado.Net к работе в приложении
- •Лекция 32. Создание пакетов установки
- •1. Общие сведения
- •2. Создание пакетов установки
- •3.Создание простого пакета установки без библиотеки .Net Framework
2.6. Индексаторы
Индексатор представляет собой разновидность свойства и обычно применяется для организации доступа к скрытым полям класса по индексу, например, так же, как мы обращаемся к элементу массива. Синтаксис индексатора аналогичен синтаксису свойства:
[атрибуты] [спецификаторы] тип this [список параметров]
{
[get код_доступа]
[set код_доступа]
}
Спецификаторы аналогичны спецификаторам свойств и методов. Индексаторы чаще всего объявляются со спецификатором public, поскольку они входят в интерфейс объекта. Атрибуты и спецификаторы могут отсутствовать.
Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) значения некоторого элемента класса. Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, индексатор доступен только для чтения, если отсутствует часть get, индексатор доступен только для записи.
Список параметров содержит одно или несколько описаний индексов, по которым выполняется доступ к элементу. Чаще всего используется один индекс целого типа.
В качестве примера рассмотрим индексатор, который позволяет получить n-член последовательности Фиббоначи:
class DemoFib
{
public int this[int i]//индексатор,доступный только для чтения
{
get
{
if (i <=0)
throw new Exception("недопустимое значение индекса");
else
if (i==1 || i==2)
return 1;
else
{
int a=1, b=1, c;
for (int j=3; j<=i; ++j){ c=a+b; a=b; b=c; }
return b;
}
}
}
}
class Program
{
static void Main()
{
Console.Write("n=");
int n=int.Parse(Console.ReadLine());
DemoFib a=new DemoFib();
try
{
Console.WriteLine("a[{0}]={1}",n,a[n]);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
Индексаторы очень удобно применять для создания специализированных массивов, на работу с которыми накладываются какие-либо ограничения. Рассмотрим в качестве примера класс-массив, значения элементов которого находятся в диапазоне [0, 100]. Кроме того, при доступе к элементу проверяется, не вышел ли индекс за допустимые границы.
class DemoArray
{
int[] MyArray; //закрытый массив
public DemoArray(int size) //конструктор
{
MyArray = new int[size];
}
public int LengthArray //свойство, возвращающее размерность
{
get { return MyArray.Length; }
}
public int this[int i] //индексатор
{
get
{
if (i <0 || i >= MyArray.Length)
throw new Exception("выход за границы массива");
else
return MyArray[i];
}
set
{
if (i <0 || i >= MyArray.Length)
throw new Exception("выход за границы массива");
else
if (value >= 0 && value <= 100)
MyArray[i] = value;
else
throw new Exception("присваивается недопустимое значение");
}
}
}
class Program
{
static void Main()
{
DemoArray a = new DemoArray(10);
for (int i=0; i<a.LengthArray; i++)
{
// использование индексатора в режиме записи
a[i] = i * i;
// использование индексатора в режиме чтения
Console.Write(a[i]+" ");
}
Console.WriteLine();
try
{
//a[10]=100;
//a[0]=200;
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
}
}
Язык С# допускает использование многомерных индексаторов. Они применяются для работы с многомерными массивами. Рассмотрим на примере предыдущую задачу при условии, что организуется двумерный массив.
class DemoArray
{
int[,] MyArray;//закрытый массив
int n, m;//закрытые поля: размерность массива
public DemoArray(int sizeN, int sizeM)//конструктор
{
MyArray = new int[sizeN, sizeM];
this.n = sizeN; this.m = sizeM;
}
public int LengthN//свойство, возвращающее количество строк
{
get { return n; }
}
public int LengthM//свойство, возвращающее количество строк
{
get { return m; }
}
public int this[int i, int j] //индексатор
{
get
{
if (i < 0 || i >= n || j < 0 || j >= m)
throw new Exception("выход за границы массива");
else
return MyArray[i, j];
}
set
{
if (i < 0 || i >= n || j < 0 || j >= m)
throw new Exception("выход за границы массива");
else
if (value >= 0 && value <= 100)
MyArray[i, j] = value;
else
throw new Exception("присваивается недопустимое значение");
}
}
}
class Program
{
static void Main()
{
DemoArray a = new DemoArray(3, 3);
for (int i = 0; i < a.LengthN; i++,Console.WriteLine())
{
for (int j = 0; j < a.LengthM; j++)
{
a[i,j]=i*j;//использование индексатора в режиме записи
Console.Write(a[i,j]);//использование индексатора в режиме чтения
}
}
Console.WriteLine();
try
{
//Console.WriteLine(a[3,3]);
//a[0,0]=200;
}
catch (Exception e)
{ Console.WriteLine(e.Message); }
}
}
