
Интерфейсы.pptx
- Количество слайдов: 25
Интерфейсы Лекция 14
Интерфейс • Интерфейс содержит определения для группы определенного функционала, который класс или структура могут реализовывать
Интерфейс • Определяется интерфейс с помощью ключевого слова интерфейс (interface). interface IEquatable
Методы Индексаторы Интерфейс События Свойства
Интерфейсы не могут содержать • Интерфейсы не могут содержать члены данных. • В них нельзя также определить конструкторы, деструкторы. • Ни один из членов интерфейса не может быть объявлен как static. • В интерфейсе описывается только сигнатура.
Интерфейсные свойства • • // Интерфейсное свойство тип имя{ get; set; }
Интерфейс или абстрактный класс Интерфейс необходим: • Когда необходимо наделить объект различным поведением. • Когда в иерархиях наследования методы должны каждый раз иметь новую реализацию. • Когда используемые классы заранее неизвестны.
Ключевое слово as • Помогает определить есть ли в заданном объекте интерфейс. Если объект удается интерпретировать как указанный интерфейс, то возвращается ссылка на интересующий интерфейс, а если нет, то ссылка null.
Ключевое слово as • IInfo obj = ui 1 as IInfo; • if (obj != null) • Console. Write. Line("Тип UI поддерживает интерфейс IInfo"); • else Console. Write. Line(": (");
Ключевое слово is • Если запрашиваемый объект не совместим с указанным интерфейсом, возвращается значение false, а если совместим, то true.
Ключевое слово is • if (ui 1 is IInfo) Console. Write. Line("Тип UI поддерживает интерфейс IInfo"); else Console. Write. Line(": (");
Наследование интерфейсов • Один интерфейс может наследовать другой. • Использовать иерархию интерфейсов может быть удобно, когда нужно расширить функциональность определенного интерфейса без нарушения уже существующих кодовых баз.
Явная реализация интерфейса • Единственный класс или структура может реализовать любое количество интерфейсов. Из-за этого всегда существует вероятность реализации интерфейсов с членами, имеющими идентичные имена. Когда для реализации интерфейса указывается еще и его имя, то это называется явная реализация.
Стандартные интерфейсы • В библиотеках базовых классов . NET поставляются сотни предопределенных типов интерфейсов, которые реализуются в различных классах и структурах.
Сравнение объектов Интерфейс IComparable определен в пространстве имен System. Он содержит всего один метод Compare. To, возвращающий результат сравнения двух объектов — текущего и переданного ему в качестве параметра: interface IComparable { int Compare. To( object obj ) }
Сравнение объектов Метод должен возвращать: • 0, если текущий объект и параметр равны; • отрицательное число, если текущий объект меньше параметра; • положительное число, если текущий объект больше параметра.
Пример 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. Write. Line( "Monster {0} t health = {1} ammo = {2}", name, health, ammo ); }
Пример public int Compare. To( 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; }
Сортировка по разным критериям (интерфейс IComparer) • Пример сортировки массива объектов из предыдущего листинга по именам (свойство Name, класс Sort. By. Name) и количеству вооружений (свойство Ammo, класс Sort. By. Ammo)
public class Sort. By. Name : IComparer // { int IComparer. Compare( object ob 1, object ob 2 ) { Monster m 1 = (Monster) ob 1; Monster m 2 = (Monster) ob 2; return String. Compare( m 1. Name, m 2. Name ); } public class Sort. By. Ammo : IComparer // { int IComparer. Compare( object ob 1, object ob 2 ) { Monster m 1 = (Monster) ob 1; Monster m 2 = (Monster) ob 2; if ( m 1. Ammo > m 2. Ammo ) return 1; if ( m 1. Ammo < m 2. Ammo ) return -1; return 0; }
Клонирование объектов • Если необходимо скопировать в другую область памяти поля объекта, можно воспользоваться методом Memberwise. Clone. При этом объекты, на которые указывают поля объекта, в свою очередь являющиеся ссылками, не копируются.
Клонирование объектов • Для создания полностью независимых объектов необходимо глубокое клонирование, когда в памяти создается дубликат всего дерева объектов. • Алгоритм глубокого клонирования весьма сложен, поскольку требует рекурсивного обхода всех ссылок объекта и отслеживания циклических зависимостей.
Клонирование объектов • Объект, имеющий собственные алгоритмы клонирования, должен объявляться как наследник интерфейса ICloneable и переопределять его единственный метод Clone.
class Monster : ICloneable { public Monster( int health, int ammo, string name ) { this. health = health; this. ammo = ammo; this. name = name; } public Monster Shallow. Clone() // поверхностная копия { return (Monster)this. Memberwise. Clone(); } public object Clone() // пользовательская копия { return new Monster(this. health, this. ammo, "Клон " + this. name); }
Домашнее задание Создайте интерфейс ISwitchable, в котором объявите два метода – включение и выключение. Придумайте и создайте два класса, которые будут реализовывать этот интерфейс.