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

Интерфейс содержит определения для группы связанных функциональных возможностей, которые может реализовать класс или структура.An interface contains definitions for a group of related functionalities that a class or a struct can implement.

С помощью интерфейсов можно, например, включить в класс поведение из нескольких источников.By using interfaces, you can, for example, include behavior from multiple sources in a class. Эта возможность очень важна в C#, поскольку этот язык не поддерживает множественное наследование классов.That capability is important in C# because the language doesn't support multiple inheritance of classes. Кроме того, необходимо использовать интерфейс, если требуется имитировать наследование для структур, поскольку они не могут фактически наследовать от другой структуры или класса.In addition, you must use an interface if you want to simulate inheritance for structs, because they can't actually inherit from another struct or class.

Интерфейс определяется с помощью ключевого слова interface,You define an interface by using the interface keyword. как показано в следующем примере.as the following example shows.

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

Имя структуры должно быть допустимым именем идентификатора C#.The name of the struct must be a valid C# identifier name. По соглашению имена интерфейсов начинаются с заглавной буквы I.By convention, interface names begin with a capital I.

Любой объект (класс или структура), реализующий интерфейс IEquatable<T>, должен содержать определение для метода Equals, соответствующее сигнатуре, которую задает интерфейс.Any class or struct that implements the IEquatable<T> interface must contain a definition for an Equals method that matches the signature that the interface specifies. В результате вы можете быть уверены, что класс, реализующий IEquatable<T>, содержит метод Equals, с помощью которого экземпляр этого класса может определить, равен ли он другому экземпляру того же класса.As a result, you can count on a class that implements IEquatable<T> to contain an Equals method with which an instance of the class can determine whether it's equal to another instance of the same class.

Определение IEquatable<T> не предоставляет реализацию для метода Equals.The definition of IEquatable<T> doesn’t provide an implementation for Equals. Интерфейс определяет только сигнатуру.The interface defines only the signature. Таким образом, интерфейс в C# аналогичен абстрактному классу, в котором все методы являются абстрактными.In that way, an interface in C# is similar to an abstract class in which all the methods are abstract. Класс или структура может реализовывать несколько интерфейсов, но класс может наследовать только одному классу, абстрактному или нет.However, a class or struct can implement multiple interfaces, but a class can inherit only a single class, abstract or not.

Дополнительные сведения об абстрактных классах см. в разделе Абстрактные и запечатанные классы и члены классов.For more information about abstract classes, see Abstract and Sealed Classes and Class Members.

Интерфейсы могут содержать методы, свойства, события, индексаторы, а также любое сочетание этих четырех типов членов.Interfaces can contain methods, properties, events, indexers, or any combination of those four member types. Ссылки на примеры см. в разделе Связанные разделы.For links to examples, see Related Sections. Интерфейс не может содержать константы, поля, операторы, конструкторы экземпляров, методы завершения или типы.An interface can't contain constants, fields, operators, instance constructors, finalizers, or types. Члены интерфейса автоматически являются открытыми, и они не могут включать модификаторы доступа.Interface members are automatically public, and they can't include any access modifiers. Члены также не могут быть статическими.Members also can't be static.

Для реализации члена интерфейса соответствующий член реализующего класса должен быть открытым и не статическим, а также иметь такое же имя и сигнатуру, что и член интерфейса.To implement an interface member, the corresponding member of the implementing class must be public, non-static, and have the same name and signature as the interface member.

Если класс (или структура) реализует интерфейс, этот класс (или структура) должен предоставлять реализацию для всех членов, которые определяет этот интерфейс.When a class or struct implements an interface, the class or struct must provide an implementation for all of the members that the interface defines. Сам интерфейс не предоставляет функциональность, которую класс или структура может наследовать таким же образом, как можно наследовать функциональность базового класса.The interface itself provides no functionality that a class or struct can inherit in the way that it can inherit base class functionality. Однако если базовый класс реализует интерфейс, то любой класс, производный от базового класса, наследует эту реализацию.However, if a base class implements an interface, any class that's derived from the base class inherits that implementation.

В следующем примере показана реализация интерфейса IEquatable<T>.The following example shows an implementation of the IEquatable<T> interface. Реализующий класс Car должен предоставлять реализацию метода Equals.The implementing class, Car, must provide an implementation of the Equals method.

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)
    {
        return this.Make == car.Make &&
               this.Model == car.Model &&
               this.Year == car.Year;
    }
}

Свойства и индексаторы класса могут определять дополнительные методы доступа для свойства или индексатора, определенного в интерфейсе.Properties and indexers of a class can define extra accessors for a property or indexer that's defined in an interface. Например, интерфейс может объявлять свойство, имеющее акцессор get.For example, an interface might declare a property that has a get accessor. Класс, реализующий этот интерфейс, может объявлять это же свойство с обоими акцессорами (get и set).The class that implements the interface can declare the same property with both a get and set accessor. Однако если свойство или индексатор использует явную реализацию, методы доступа должны совпадать.However, if the property or indexer uses explicit implementation, the accessors must match. Дополнительные сведения о явной реализации см. в статьях Явная реализация интерфейса и Свойства интерфейса.For more information about explicit implementation, see Explicit Interface Implementation and Interface Properties.

Интерфейсы могут наследовать от других интерфейсов.Interfaces can inherit from other interfaces. Класс может включать интерфейс несколько раз через наследуемые базовые классы или через интерфейсы, которые наследуются другими интерфейсами.A class might include an interface multiple times through base classes that it inherits or through interfaces that other interfaces inherit. Однако класс может предоставить реализацию интерфейса только однократно и только если класс объявляет интерфейс как часть определения класса (class ClassName : InterfaceName).However, the class can provide an implementation of an interface only one time and only if the class declares the interface as part of the definition of the class (class ClassName : InterfaceName). Если интерфейс наследуется, поскольку наследуется базовый класс, реализующий этот интерфейс, то базовый класс предоставляет реализацию членов этого интерфейса.If the interface is inherited because you inherited a base class that implements the interface, the base class provides the implementation of the members of the interface. Но производный класс может повторно реализовать любые члены виртуального интерфейса и не использовать наследованную реализацию.However, the derived class can reimplement any virtual interface members instead of using the inherited implementation.

Базовый класс также может реализовывать члены интерфейса с помощью виртуальных членов.A base class can also implement interface members by using virtual members. В таком случае производный класс может изменять поведение интерфейса путем переопределения виртуальных членов.In that case, a derived class can change the interface behavior by overriding the virtual members. Дополнительные сведения о виртуальных членах см. в статье Полиморфизм.For more information about virtual members, see Polymorphism.

Сводка по интерфейсамInterfaces summary

Интерфейс имеет следующие свойства.An interface has the following properties:

  • Интерфейс подобен абстрактному базовому классу, имеющему только абстрактные члены.An interface is like an abstract base class with only abstract members. Любой класс (или структура), реализующий интерфейс, должен реализовывать все его члены.Any class or struct that implements the interface must implement all its members.
  • Невозможно создать экземпляр интерфейса напрямую.An interface can't be instantiated directly. Его члены реализуются любым классом (или структурой), реализующим интерфейс.Its members are implemented by any class or struct that implements the interface.
  • Интерфейсы могут содержать события, индексаторы, методы и свойства.Interfaces can contain events, indexers, methods, and properties.
  • Интерфейсы не содержат реализацию методов.Interfaces contain no implementation of methods.
  • Класс или структура может реализовывать несколько интерфейсов.A class or struct can implement multiple interfaces. Класс может наследовать базовому классу и также реализовывать один или несколько интерфейсов.A class can inherit a base class and also implement one or more interfaces.

Содержание разделаIn this section

Явная реализация интерфейсаExplicit Interface Implementation
В этом разделе объясняется, как создать член класса, который относится к интерфейсу.Explains how to create a class member that’s specific to an interface.

Практическое руководство. Явная реализация элементов интерфейсаHow to: Explicitly Implement Interface Members
В этом разделе содержится пример явной реализации членов интерфейсов.Provides an example of how to explicitly implement members of interfaces.

Практическое руководство. Явная реализация элементов двух интерфейсовHow to: Explicitly Implement Members of Two Interfaces
В этом разделе содержится пример явной реализации членов интерфейсов с помощью наследования.Provides an example of how to explicitly implement members of interfaces with inheritance.

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

Интерфейсы в изучении C# 3.0. Овладение основными понятиями C# 3.0Interfaces in Learning C# 3.0: Master the Fundamentals of C# 3.0

См. такжеSee also