Интерфейсы
Интерфейс
Интерфейс
Интерфейсы не могут содержать
Интерфейсные свойства
Интерфейс или абстрактный класс
Ключевое слово as
Ключевое слово as
Ключевое слово is
Ключевое слово is
Наследование интерфейсов
Явная реализация интерфейса
Стандартные интерфейсы
Сравнение объектов
Сравнение объектов
Пример
Пример
Сортировка по разным критериям (интерфейс IComparer)
Клонирование объектов
Клонирование объектов
Клонирование объектов
Домашнее задание
359.30K
Категория: ПрограммированиеПрограммирование

Интерфейсы

1. Интерфейсы

2. Интерфейс

• Интерфейс содержит определения
для группы определенного
функционала,
который класс или структура могут
реализовывать

3. Интерфейс

• Определяется интерфейс с
помощью ключевого
слова интерфейс (interface).
interface IEquatable<T> {
bool Equals(T obj);
}

4.

Методы
Индексаторы
Интерфейс
События
Свойства

5. Интерфейсы не могут содержать

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

6. Интерфейсные свойства


// Интерфейсное свойство
тип имя{
get;
set; }

7. Интерфейс или абстрактный класс

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

8. Ключевое слово as

• Помогает определить есть ли в
заданном объекте интерфейс.
Если объект удается
интерпретировать как указанный
интерфейс, то возвращается
ссылка на интересующий
интерфейс, а если нет, то ссылка
null.

9. Ключевое слово as

• IInfo obj = ui1 as IInfo;
• if (obj != null)
• Console.WriteLine("Тип UI
поддерживает интерфейс IInfo");
• else Console.WriteLine(":(");

10. Ключевое слово is

• Если запрашиваемый объект не
совместим с указанным
интерфейсом, возвращается
значение false, а если совместим,
то true.

11. Ключевое слово is

• if (ui1 is IInfo)
Console.WriteLine("Тип UI
поддерживает интерфейс IInfo");
else Console.WriteLine(":(");

12. Наследование интерфейсов

• Один интерфейс может
наследовать другой.
• Использовать иерархию
интерфейсов может быть удобно,
когда нужно расширить
функциональность определенного
интерфейса без нарушения уже
существующих кодовых баз.

13. Явная реализация интерфейса

• Единственный класс или структура
может реализовать любое количество
интерфейсов. Из-за этого всегда
существует вероятность реализации
интерфейсов с членами, имеющими
идентичные имена. Когда для
реализации интерфейса указывается
еще и его имя, то это называется явная
реализация.

14. Стандартные интерфейсы

• В библиотеках базовых классов
.NET поставляются сотни
предопределенных типов
интерфейсов, которые
реализуются в различных классах
и структурах.

15. Сравнение объектов

Интерфейс IComparable определен в
пространстве имен System. Он содержит всего
один метод CompareTo, возвращающий
результат сравнения двух объектов —
текущего и переданного ему в качестве
параметра:
interface IComparable
{
int CompareTo( object obj )
}

16. Сравнение объектов

Метод должен возвращать:
• 0, если текущий объект и параметр равны;
• отрицательное число, если текущий объект
меньше параметра;
• положительное число, если текущий объект
больше параметра.

17. Пример

class Monster : IComparable
{
public Monster( int health, int ammo, string
name )
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
virtual public void Passport()
{
Console.WriteLine( "Monster {0} \t health =
{1} ammo = {2}",
name, health, ammo );
}

18. Пример

public int CompareTo( object obj )
//
реализация интерфейса
{
Monster temp = (Monster) obj;
if ( this.health > temp.health ) return 1;
if ( this.health < temp.health ) return -1;
return 0;
}
string name;
int health, ammo;
}

19. Сортировка по разным критериям (интерфейс IComparer)

• Пример сортировки массива
объектов из предыдущего листинга
по именам (свойство Name,
класс SortByName) и количеству
вооружений (свойство Ammo,
класс SortByAmmo)

20.

public class SortByName : IComparer
//
{
int IComparer.Compare( object ob1, object ob2 )
{
Monster m1 = (Monster) ob1;
Monster m2 = (Monster) ob2;
return String.Compare( m1.Name, m2.Name );
}
}
public class SortByAmmo : IComparer
{
int IComparer.Compare( object ob1, object ob2 )
{
Monster m1 = (Monster) ob1;
Monster m2 = (Monster) ob2;
if ( m1.Ammo > m2.Ammo ) return 1;
if ( m1.Ammo < m2.Ammo ) return -1;
return 0;
}
}
//

21. Клонирование объектов

• Если необходимо скопировать в
другую область памяти поля
объекта, можно воспользоваться
методом MemberwiseClone. При
этом объекты, на которые
указывают поля объекта, в свою
очередь являющиеся ссылками, не
копируются.

22. Клонирование объектов

• Для создания полностью независимых
объектов необходимо глубокое
клонирование, когда в памяти
создается дубликат всего дерева
объектов.
• Алгоритм глубокого клонирования
весьма сложен, поскольку требует
рекурсивного обхода всех ссылок
объекта и отслеживания циклических
зависимостей.

23. Клонирование объектов

• Объект, имеющий собственные
алгоритмы клонирования, должен
объявляться как наследник
интерфейса ICloneable и
переопределять его единственный
метод Clone.

24.

class Monster : ICloneable
{ public Monster( int health, int ammo, string name )
{
this.health = health;
this.ammo = ammo;
this.name = name;
}
public Monster ShallowClone()
// поверхностная
копия
{
return (Monster)this.MemberwiseClone();
}
public object Clone()
// пользовательская
копия
{
return new Monster(this.health, this.ammo, "Клон " +
this.name);
}

25. Домашнее задание

Создайте интерфейс ISwitchable, в
котором объявите два метода –
включение и выключение.
Придумайте и создайте два
класса, которые будут
реализовывать этот интерфейс.
English     Русский Правила