Слайд 2Особенности интерфейсов
Как специальный (можно сказать, упрощенный) класс, интерфейс обладает следующими особенностями:
может
содержать только объявления методов или свойств (без определений). Такие элементы называют абстрактными;
элементы интерфейса всегда открыты (public по определению) и модификаторы защиты при их объявлении также не указываются;
имя интерфейса рекомендуют начинать с I.
Слайд 3Особенности интерфейсов
Что может определять интерфейс?
методы;
свойства;
индексаторы;
события;
статические поля и константы.
Слайд 4Особенности интерфейсов
При объявлении класса или структуры, поддерживающих интерфейс, имя интерфейса указывается в
списке базовых классов. У структур такой список может состоять только из интерфейсов.
Если интерфейс поддерживает производный класс, имя его базового класса в списке должно быть первым.
В любом случае все элементы поддерживаемого интерфейса (то есть абстрактные методы) должны быть определены (реализованы) в классе или структуре.
В условиях отсутствия в C# множественного наследования от классов интерфейсы позволяют поддержать неограниченное количество вариантов поведения (то есть полиморфизм).
Слайд 5Операции для работы с интерфейсами
Операция is бинарная логическая. Возвращает значение true, если
тип объекта совместим с указанным интерфейсом, и false – в противном случае. Проще говоря, операция проверяет, есть ли в составе данного объекта элементы указанного интерфейса. Синтаксис: Name is IName.
Name – имя объекта; IName – имя интерфейса.
Операция as также бинарная и возвращает ссылку на элемент-
интерфейс в составе объекта
IName i = Name as IName;
Здесь i – ссылка на интерфейс. Если тип данного объекта не поддерживает данный интерфейс, операция as возвращает null. Говорят, что при использовании данной операции реализуется доступ через интерфейсную ссылку. После этого допустим следующий вызов:
i.ИмяЭлементаИнтерфейса;
ИмяЭлементаИнтерфейса – имя метода или свойства.
Слайд 6Операции для работы с интерфейсами
Ссылку на элемент-интерфейс (который входит в состав объекта)
можно
получить и с помощью операции явного приведения типов (это называется объектной ссылкой):
…(IName)Name.ИмяЭлементаИнтерфейса …
Один и тот же интерфейс может поддерживаться (и реализовываться) типами из различных иерархий наследования. Это даёт возможность использовать полиморфизм для семантически несовместимых объектов, если все они поддерживают один интерфейс. К примеру, можно объявить массив интерфейсных объектов
IName[] Имя = { new Type1(), new Type2() …};
и тогда в цикле c помощью инструкции
… Имя[i].ИмяЭлементаИнтерфейса …
можно осуществить доступ к элементу интерфейса конкретного объекта, если Type1, Type2 – типы, реализующие интерфейс IName.
Слайд 7Стандартные интерфейсы
ICloneable
IComparable и IComparer
IEnumerator и IEnumirable
IDisposible
Слайд 8ICloneable
Данный интерфейс предназначен для создания глубоких копий объектов.
Интерфейс клонируемый содержит объявление метода
Clone():
public interface ICloneable
{ objeсt Clone();}
Слайд 10Зачем он нужен?
В данном случае объекты cl1 и cl2 будут указывать на
один и тот же объект в памяти, поэтому изменения свойств в переменной cl2 затронут также и переменную cl1.
Чтобы переменная cl2 указывала на новый объект, но со значениями из cl1, его необходимо клонировать.
Слайд 12Можно проще
Для сокращения кода копирования мы можем использовать специальный метод MemberwiseClone(), который
возвращает копию объекта
Слайд 13Недостаток
Этот метод реализует поверхностное (неглубокое) копирование.
Если в классе есть поля-объекты от других
классов, то в объекте-клоне создастся не новый объект, а копируется ссылка от текущего
Слайд 18IComparable
Однако метод Sort по умолчанию работает только для наборов примитивных типов, как
int или string. Для сортировки наборов сложных объектов применяется интерфейс IComparable.
Слайд 19IComparable
Интерфейс IComparable (компарабельный) – простое сравнение – объявлен в пространстве имён System,
содержит всего один метод, возвращающий результат сравнения двух объектов (текущего и obj):
interface IComparable { int CompareTo(object obj)}
Возвращаемое значение:
0 – объекты равны;
> 0 – текущий больше obj;
< 0 – текущий меньше obj.