Интерфейсы

Содержание

Слайд 2

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

Интерфейс

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

Слайд 3

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

Интерфейс

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


}
Слайд 4

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

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

Слайд 5

Интерфейсы не могут содержать Интерфейсы не могут содержать члены данных. В

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

Интерфейсы не могут содержать члены данных.
В них

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

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

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

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

Слайд 7

Интерфейс или абстрактный класс Интерфейс необходим: Когда необходимо наделить объект различным

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

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

иерархиях наследования методы должны каждый раз иметь новую реализацию.
Когда используемые классы заранее неизвестны.
Слайд 8

Ключевое слово as Помогает определить есть ли в заданном объекте интерфейс.

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

Помогает определить есть ли в заданном объекте интерфейс. Если

объект удается интерпретировать как указанный интерфейс, то возвращается ссылка на интересующий интерфейс, а если нет, то ссылка null. 
Слайд 9

Ключевое слово as IInfo obj = ui1 as IInfo; if (obj

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

IInfo obj = ui1 as IInfo;
if (obj !=

null)
Console.WriteLine("Тип UI поддерживает интерфейс IInfo");
else Console.WriteLine(":(");
Слайд 10

Ключевое слово is Если запрашиваемый объект не совместим с указанным интерфейсом,

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

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

значение false, а если совместим, то true.
Слайд 11

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

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

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

else Console.WriteLine(":(");
Слайд 12

Наследование интерфейсов Один интерфейс может наследовать другой. Использовать иерархию интерфейсов может

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

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

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

Явная реализация интерфейса Единственный класс или структура может реализовать любое количество

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

Единственный класс или структура может реализовать любое количество интерфейсов.

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

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

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

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

реализуются в различных классах и структурах.
Слайд 15

Сравнение объектов Интерфейс IComparable определен в пространстве имен System. Он содержит

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

Интерфейс IComparable определен в пространстве имен System. Он содержит всего один метод CompareTo, возвращающий

результат сравнения двух объектов — текущего и переданного ему в качестве параметра:
interface IComparable
{
    int CompareTo( object obj )
}
Слайд 16

Сравнение объектов Метод должен возвращать: 0, если текущий объект и параметр

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

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

если текущий объект меньше параметра;
положительное число, если текущий объект больше параметра.
Слайд 17

Пример class Monster : IComparable { public Monster( int health, int

Пример

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 ) // реализация интерфейса {

Пример

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) Пример сортировки массива объектов из

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

Пример сортировки массива объектов из предыдущего

листинга по именам (свойство Name, класс SortByName) и количеству вооружений (свойство Ammo, класс SortByAmmo)
Слайд 20

public class SortByName : IComparer // { int IComparer.Compare( object ob1,

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,

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);
        }