Интерфейсы (Руководство по программированию в C#)

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

С помощью интерфейсов можно, например, включить расширение функциональности из нескольких источников в классе. Эта возможность важна в C-#, поскольку язык не поддерживает множественное наследование класса. Кроме того, необходимо использовать интерфейс, если требуется имитировать наследование для структур, поскольку они фактически не могут наследовать из других структуры или класса.

Определен интерфейс с помощью ключевого слова интерфейс, как показано в следующем примере.

interface IEquatable<T>
{
    bool Equals(T obj);
}

Любой класс или структура, реализующие интерфейс IEquatable, должны содержать определение метода Equals, который соответствует сигнатуре, интерфейс определяет. В результате можно возвращении класс, реализующий интерфейс IEquatable<T>, который содержит метод Equals, с которым экземпляр класса может определить, является ли он равен другой экземпляр класса.

Определение IEquatable<T> не предоставляет реализацию Equals. Интерфейс определяет только сигнатуру. В этом образом интерфейс в C-# аналогичен к абстрактному классу, в котором все методы являются абстрактными. Однако класс или структура может реализовывать несколько интерфейсов, но класс может наследовать только один класс, абстрактные или нет. Таким образом, с помощью интерфейсов можно включить расширение функциональности из нескольких источников в классе.

Дополнительные сведения об абстрактных классах см. в разделе Абстрактные и запечатанных классов и членов класса.

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

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

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

В следующем примере показана реализация интерфейса<T> IEquatable. Класс, реализующий Car, должен предоставить реализацию метода Equals.

public class Car : IEquatable<Car>
{
    public string Make {get; set;}
    public string Model { get; set; }
    public string Year { get; set; }

    // Implementation of IEquatable<T> interface 
    public bool Equals(Car car)
    {
        if (this.Make == car.Make &&
            this.Model == car.Model &&
            this.Year == car.Year)
        {
            return true;
        }
        else 
            return false;
    }
}

Свойства класса и индексаторы могут определять дополнительные методы доступа для свойства или индексатора, определенный в интерфейсе. Например, интерфейс может объявить свойство, которое имеет доступ получение. Класс, реализующий интерфейс может объявлять то же свойство как с get, так и с доступом набор. Если же свойство или индексатор использует явную реализацию, методы доступа должны совпадать. Дополнительные сведения о конкретной реализации см. в разделах Явная реализация интерфейса (Руководство по программированию в C#) и Свойства интерфейса (Руководство по программированию на C#).

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

Базовый класс также реализовать члены интерфейса с помощью виртуальных элементов. В этом случае производный класс может изменить поведение интерфейса путем переопределения виртуальных членов. Дополнительные сведения о виртуальных членах см. в разделе Полиморфизм.

Общие интерфейсы

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

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

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

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

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

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

Содержание

Связанные разделы

Важная глава книги

Интерфейсы в Зная C-# 3,0. Образец в C-# 3,0

См. также

Ссылки

Наследование (Руководство по программированию на C#)

Основные понятия

Руководство по программированию на C#