Интерфейсы. Что может определять интерфейс?

Содержание

Слайд 2

Особенности интерфейсов

Как специальный (можно сказать, упрощенный) класс, интерфейс обладает следующими особенностями:
может

Особенности интерфейсов Как специальный (можно сказать, упрощенный) класс, интерфейс обладает следующими особенностями:
содержать только объявления методов или свойств (без определений). Такие элементы называют абстрактными;
элементы интерфейса всегда открыты (public по определению) и модификаторы защиты при их объявлении также не указываются;
имя интерфейса рекомендуют начинать с I.

Слайд 3

Особенности интерфейсов

Что может определять интерфейс?
методы;
свойства;
индексаторы;
события;
статические поля и константы.

Особенности интерфейсов Что может определять интерфейс? методы; свойства; индексаторы; события; статические поля и константы.

Слайд 4

Особенности интерфейсов

При объявлении класса или структуры, поддерживающих интерфейс, имя интерфейса указывается в

Особенности интерфейсов При объявлении класса или структуры, поддерживающих интерфейс, имя интерфейса указывается
списке базовых классов. У структур такой список может состоять только из интерфейсов.
Если интерфейс поддерживает производный класс, имя его базового класса в списке должно быть первым.
В любом случае все элементы поддерживаемого интерфейса (то есть абстрактные методы) должны быть определены (реализованы) в классе или структуре.
В условиях отсутствия в C# множественного наследования от классов интерфейсы позволяют поддержать неограниченное количество вариантов поведения (то есть полиморфизм).

Слайд 5

Операции для работы с интерфейсами

Операция is бинарная логическая. Возвращает значение true, если

Операции для работы с интерфейсами Операция 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

Стандартные интерфейсы ICloneable IComparable и IComparer IEnumerator и IEnumirable IDisposible

Слайд 8

ICloneable

Данный интерфейс предназначен для создания глубоких копий объектов.
Интерфейс клонируемый содержит объявление метода

ICloneable Данный интерфейс предназначен для создания глубоких копий объектов. Интерфейс клонируемый содержит
Clone():
public interface ICloneable
{ objeсt Clone();}

Слайд 9

Зачем он нужен?

Пример:

Зачем он нужен? Пример:

Слайд 10

Зачем он нужен?

В данном случае объекты cl1 и cl2 будут указывать на

Зачем он нужен? В данном случае объекты cl1 и cl2 будут указывать
один и тот же объект в памяти, поэтому изменения свойств в переменной cl2 затронут также и переменную cl1.
Чтобы переменная cl2 указывала на новый объект, но со значениями из cl1, его необходимо клонировать.

Слайд 11

Реализация

Реализация

Слайд 12

Можно проще

Для сокращения кода копирования мы можем использовать специальный метод MemberwiseClone(), который

Можно проще Для сокращения кода копирования мы можем использовать специальный метод MemberwiseClone(), который возвращает копию объекта
возвращает копию объекта

Слайд 13

Недостаток

Этот метод реализует поверхностное (неглубокое) копирование.
Если в классе есть поля-объекты от других

Недостаток Этот метод реализует поверхностное (неглубокое) копирование. Если в классе есть поля-объекты
классов, то в объекте-клоне создастся не новый объект, а копируется ссылка от текущего

Слайд 14

Добавим класс

Добавим класс

Слайд 15

Что получаем

Что получаем

Слайд 16

Глубокое копирование

Глубокое копирование

Слайд 17

IComparable

IComparable

Слайд 18

IComparable

Однако метод Sort по умолчанию работает только для наборов примитивных типов, как

IComparable Однако метод Sort по умолчанию работает только для наборов примитивных типов,
int или string. Для сортировки наборов сложных объектов применяется интерфейс IComparable.

Слайд 19

IComparable

Интерфейс IComparable (компарабельный) – простое сравнение – объявлен в пространстве имён System,

IComparable Интерфейс IComparable (компарабельный) – простое сравнение – объявлен в пространстве имён
содержит всего один метод, возвращающий результат сравнения двух объектов (текущего и obj):
interface IComparable { int CompareTo(object obj)}
Возвращаемое значение:
0 – объекты равны;
> 0 – текущий больше obj;
< 0 – текущий меньше obj.

Слайд 20

Реализация

Реализация
Имя файла: Интерфейсы.-Что-может-определять-интерфейс?.pptx
Количество просмотров: 18
Количество скачиваний: 0