Слайд 2Общие сведения об интерфейсе
Интерфейс представляет ссылочный тип, который может
определять некоторый функционал - набор методов и свойств без реализации.
Затем этот функционал реализуют классы и структуры, которые применяют данные интерфейсы.
Интерфейс определяет поведение, которое поддерживается реализующими этот интерфейс классами.
Слайд 3Общие сведения об интерфейсе
Интерфейс может наследовать свойства нескольких интерфейсов,
в этом случае предки перечисляются через запятую.
Тело интерфейса составляют
абстрактные методы, шаблоны свойств и индексаторов, а также события.
Интерфейс не может содержать константы, поля, операции, конструкторы, деструкторы, типы и любые статические элементы.
Слайд 4Интерфейсы или наследование классов?
Если некий набор действий имеет смысл только
для какой-то конкретной иерархии классов, реализующих эти действия разными способами,
уместнее задать этот набор в виде виртуальных методов абстрактного базового класса иерархии.
То, что работает в пределах иерархии одинаково, предпочтительно полностью определить в базовом классе.
Интерфейсы чаще используются для задания общих свойств классов, относящихся к различным иерархиям.
Слайд 5Отличия интерфейса от абстрактного класса
элементы интерфейса по умолчанию имеют спецификатор
доступа public и не могут иметь спецификаторов, заданных явным образом;
класс,
в списке предков которого задается интерфейс, должен определять все его элементы, в то время как потомок абстрактного класса может не переопределять часть абстрактных методов предка (в этом случае производный класс также будет абстрактным);
класс может иметь в списке предков несколько интерфейсов, при этом он должен определять все их методы.
Слайд 6Реализация интерфейса
В C# поддерживается одиночное наследование для классов и
множественное — для интерфейсов. Это позволяет придать производному классу свойства нескольких
базовых интерфейсов, реализуя их по своему усмотрению.
Слайд 7Операция is
При работе с объектом через объект типа интерфейса
бывает необходимо убедиться, что объект поддерживает данный интерфейс.
Проверка выполняется
с помощью бинарной операции is. Она определяет, совместим ли текущий тип объекта, находящегося слева от ключевого слова is, с типом, заданным справа.
Результат операции равен true, если объект можно преобразовать к заданному типу, и false в противном случае. Операция обычно используется в следующем контексте:
if ( объект is тип )
{
// выполнить преобразование "объекта" к "типу"
// выполнить действия с преобразованным объектом
}
Слайд 8Операция as
Операция as выполняет преобразование к заданному типу, а если это
невозможно, формирует результат null:
static void Act( object A )
{
IAction Actor = A as IAction;
if ( Actor != null ) Actor.Draw();
}
Обе рассмотренные операции применяются как к интерфейсам, так и к классам.
Слайд 9Стандартные интерфейсы .NET
В библиотеке классов .NET определено множество стандартных
интерфейсов, задающих желаемое поведение объектов. Например, интерфейс IComparable задает метод
сравнения объектов на «больше-меньше», что позволяет выполнять их сортировку.
Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью foreach, а реализация интерфейса ICloneable — клонировать объекты.
Стандартные интерфейсы поддерживаются многими стандартными классами библиотеки. Например, работа с массивами с помощью foreach возможна оттого что тип Array реализует интерфейсы IEnumerable и IEnumerator.
Можно создавать и собственные классы, поддерживающие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.