Similar presentations:
Интерфейсы
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, вкотором объявите два метода –
включение и выключение.
Придумайте и создайте два
класса, которые будут
реализовывать этот интерфейс.