- •Практична робота. Середовище розробки додаткив с#. Базові класи. Клас String.
- •Методи классу String для робот из рядками
- •Варіанти індивідуальних завдань
- •Контрольні питання
- •Практична робота 1. Проектування. Класи. Конструктори класу. Статичниі елементів класу. Спадкоємство. Частина 1.Класи. Конструктори класу. Статичні елементи класу.
- •Теоретична частина
- •Приклад
- •Хід виконання роботи
- •Індивідуальні завдання
- •Контольні запитання
- •Частина 2. Спадкоємство.
- •Теоретична частина
- •Приклад класичного спадкоємства
- •Приклад спадкоємства включення - делегування
- •Контрольні питання
- •Практична робота 2. Використання системних інтерфейсів. Створення класів походних від стандартних інтерфейсів. Частина 1. Інтерфейс iCloneable.
- •Теоретична частина
- •Приклад
- •Контрольні питання
- •Частина 2. Інтерфейси iСomparable і iСomparer.
- •Теоретична частина
- •Приклад
- •Контрольні питання
- •Частина 3. Інтерфейси iEnumerable і iEnumerator.
- •Теоретична частина
- •Інтерфейс iEnumerable
- •Приклад
- •Реалізація класу -коллекция без реалізації інтерфейсу Iеnumerator
- •Контрольні питання
- •Практическая работа 3. Моделювання в конструюванні. Використання масивів для розроблених типів. Частина 1. Користувальницький індексатор.
- •Теоретическая часть
- •Отличия между свойствами и индексаторами
- •Интерфейсы и индексаторы
- •Частина 2. Перевантаження унарних та бінарних операцій.
- •Теоретическая часть
- •Пример на перегрузку унарного оператора
- •Пример на перегрузку true и false
- •Пример на перегрузку бинарного оператора
- •Пример на перегрузку явных и неявных преобразований
- •Практична робота 4. Моделювання в конструюванні. Створення та використання класу ArrayList для розроблених типів. Частина 1. Частина 1.Створення власної колекції.
- •Теоретична частина
Интерфейсы и индексаторы
При объявлении индексатора в интерфейсе нужно придерживаться следующих правил: индексатор описывается без модификаторов, индексатор должен иметь функции доступа без тела.
interface IMyInterface
{
...
// Объявление индексатора
string this[int index]
{
get;
set;
}
}
Пример
using System;
using System.Collections;
class SomeClass : IEnumerable // Для использования foreach
{
// Поле
string [] words;
// Числовой индексатор
public string this [int index]
{
// Функция чтения
get
{
if(index < 0 || index >= words.Length)
throw new IndexOutOfRangeException();
return words[index];
}
// Функция записи
set
{
if(index < 0 || index >= words.Length)
throw new IndexOutOfRangeException();
words[index] = value;
}
}
// Строковый индексатор
public int this [string name]
{
// Функция чтения
get
{
// Поиск индекса, соответствующего искомой строке
return Array.IndexOf(words, name);
}
}
//Конструктор
public SomeClass(int n)
{
if(n >= 0)
words = new string[n];
}
// Реализация интерфейса IEnumerable
public IEnumerator GetEnumerator()
{
// Массивы реализуют интерфейс IEnumerable самостоятельно
return words.GetEnumerator();
}
}
class Test
{
static void Main()
{
SomeClass sc = new SomeClass(3);
// Используем числовой индексатор
sc[0] = "book";
sc[1] = "bird";
sc[2] = "beer";
// Перебор значений массива
foreach(string s in sc)
{
Console.WriteLine(s);
}
// Используем строковый индексатор
Console.WriteLine(sc["beer"]);
Console.WriteLine(sc["boat"]);
Console.Read();
}
}
Частина 2. Перевантаження унарних та бінарних операцій.
Тема - перегрузка унарных и бинарных операций, перегрузка явных и неявных преобразований.
Цель - научиться создавать типы, которые поддерживают перегрузку операций и преобразований типов: явное и неявное.
Задание. Реализовать перегрузку стандартных операций и перегрузку преобразования типов для пользовательского типа.
Теоретическая часть
Перегрузка – это своеобразное реагирование пользовательских типов на встроенные операторы.
рublic static тип возвращаемого значения operator знак операции (параметр типа класса)
например, public static int operator + (SomeClass o)
Перегрузка не входит в спецификацию Common Language Specification (CLS).
Перегруженные операторы должны быть открытыми статическими функциями класса.
Унарные операторы должны иметь один параметр, который должен иметь тип класса, в котором он реализуется.
Можно перегружать следующие унарные операторы: +, -, !, ~, ++, --, true, false
Перегрузка операторов true, false должна возвращать тип bool и перегружаться в паре.
Можно перегружать следующие бинарные операторы: +, -, *, /, %, &, |, ^, <<, >>
Бинарные операторы должны иметь два параметра: один из двух параметров функции должен иметь тип класса, в котором он реализуется.
Если в классе перегружен оператор + (например), то оператор += перегружается автоматически (это справедливо для всех вышеперечисленных бинарных операторов).
Операторы сравнения ==, !=, <, >, <=, >= всегда перегружаются парами: == и !=, < и >, <= и >=.
Следующие операторы перегружаться не могут: =, ., ?:, ->, new, is, sizeof, typeof
Оператор () перегружаться не может, но вместо него можно определить собственные преобразования.
Неявные преобразования - это преобразования, которые можно применять без приведения типов. Такие преобразования (желательно) не должны вызывать исключительных ситуаций и не допускать потерю информации.
Явные преобразования - это преобразования, которые применяются с приведением типа. Такие преобразования могут вызывать исключительные ситуации и допускать потерю информации.
