Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3.9. Понятие «Интерфейс» Понятие «Интерфейс»

1. Понятие «Интерфейс»

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

interface IEquatable<T>

{

bool Equals(T obj);

}

IEquatable<T> определяет обобщённый метод сравнения, тип значения или класс которого используется для определения равенства экземпляров.

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

Когда класс или структура реализует интерфейс, класс или структура предоставляет реализацию для всех членов, определяемых интерфейсом. Сам интерфейс не предоставляет функциональных возможностей, которые класс или структура могут наследовать таким же образом, каким могут наследоваться функциональные возможности базового класса. Однако если базовый класс реализует интерфейс, производный класс наследует эту реализацию. Говорится, что производный класс неявно реализует интерфейс.

Классы и структуры реализуют интерфейсы таким же образом, как классы наследуются от базового класса или структуры, но есть два исключения:

  • Класс или структура может реализовать несколько интерфейсов.

  • Если класс или структура реализует интерфейс, она получает только имена и сигнатуры метода, поскольку в интерфейсе не содержится никаких реализаций, как показано в следующем примере:

public class Car : IEquatable<Car>

{

public string Make { get; set; }

public string Model { get; set; }

public string Year { get; set; }

// Реализация IEquatable<T> интерфейса из кода выше

public bool Equals(Car car)

{

if (this.Make == car.Make &&

this.Model == car.Model &&

this.Year == car.Year)

{

return true;

}

else

return false;

}

}

Интерфейс IEquatable<T> объявляет пользователю объекта, что объект может определять, равен ли он другому объекту такого же типа, причём пользователь интерфейса не должен знать, как именно это реализовано.

Для реализации члена интерфейса соответствующий член класса должен быть открытым и не статическим, он должен обладать таким же именем и сигнатурой, как член интерфейса. Свойства и индексаторы класса могут определить дополнительные методы доступа для свойства или индексатора, определённого в интерфейсе. Например, интерфейс может объявлять свойство, имеющее метод доступа get. Класс, реализующий интерфейс может объявлять это же свойство с get и set методами доступа. Если же свойство или индексатор использует явную реализацию, методы доступа должны совпадать.

Интерфейсы и члены интерфейсов являются абстрактными. Интерфейсы не имеют реализации по умолчанию.

Интерфейсы могут наследовать другие интерфейсы.

Класс может наследовать интерфейс несколько раз посредством наследуемых базовых классов или посредством интерфейсов, наследуемых другими интерфейсами. Однако класс может реализовать интерфейс только один раз, и только если интерфейс объявляется в рамках определения класса, как в class ClassName : InterfaceName. Если интерфейс унаследован вследствие наследования базового класса, реализующего интерфейс, его реализация предоставляется базовым классом. Базовый класс также может реализовать члены интерфейса с помощью виртуальных членов. В этом случае производный класс может изменить поведение интерфейса путем переопределения виртуальных членов.

Итак подведём небольшой итог: интерфейсы на С# обеспечивают разработку классов, у которых могут быть общие функции, но при этом они не являются частями одной и той же иерархии классов. Интерфейсы играют особую роль в разработке на С#, поскольку С# не поддерживает множественное наследование. Чтобы совместно использовать методы и свойства, классы могут реализовывать несколько интерфейсов. Приведем пример ещё одного простейшего интерфейса:

public interface IUIControl

{

void Paint();

}

public class Button : IUIControl

{

public void Paint()

{

// Рисуем кнопку

}

}

public class ListBox : IUIControl

{

public void Paint()

{

// Рисуем выпадающий список

}

}

В данном случае создаётся интерфейс IUIControl, в котором определяем, но не реализуем метод Paint. В свою очередь классы Button и ListBox реализуют этот интерфейс и переопределяют метод Paint. Концептуально интерфейсы представляют собой связки между двумя в корне отличными частями кода. Иначе говоря, при наличии интерфейса и класса, определённого как реализующий данный интерфейс, клиентам класса даётся гарантия, что у класса реализованы все методы, определённые в интерфейсе. По умолчанию все члены интерфейса являются общедоступными, чтобы их мог реализовать какой-либо класс.

Интерфейс имеет следующие свойства:

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

  • Невозможно создать экземпляр интерфейса напрямую.

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

  • Интерфейсы не содержат реализации методов.

  • Как классы, так и структуры способны реализовывать несколько интерфейсов.

  • Интерфейс может быть унаследован от нескольких интерфейсов.