В этом разделе рассматриваются интерфейсы за счет представления полного определения одного из интерфейсов, определенного Microsoft — System. IDisposable. Интерфейс IDisposable содержит один метод Dispose (), предназначенный для реализации классами, которые выполняют очистку кода:
public interface IDisposable
{void Dispose ( ); }
Этот фрагмент показывает, что объявление интерфейса синтаксически очень похоже на объявление абстрактного класса/ Однако вы должны знать, что не допускается указывать никакой реализации ни для одного из членов интерфейса. Вообще говоря, интерфейс может содержать только объявления методов, свойств, индексов и событий.
Вы никогда не создадите экземпляр интерфейса; он содержит только сигнатуры своих членов. Интерфейс не имеет никаких конструкторов, равно как и никаких полей (поскольку это подразумевает некоторую внутреннюю реализацию). Определению интерфейса также не разрешено содержать перегрузки операций, причем не потому, что с этим связаны какие-то принципиальные проблемы — их нет, а потому, что назначение интерфейсов состоит в том, чтобы быть общедоступными контрактами, для которых перегрузка операций вызывала бы определенные проблемы совместимости с другими языками .NET, такими как Visual Basic и .NET, которые не поддерживают перегрузку операций.
Также не допускается указывать модификаторы при определении членов интерфейса. Члены интерфейса всегда неявно являются publicи не могут быть virtual или static. Это оставлено для реализации классам. Поэтому это нормально — указывать модификаторы доступа к членам интерфейса в реализующих их классах, что и делается в примерах настоящего раздела.
Возьмем, например, IDisposable. Если класс пожелает объявить, что он реализует метод Dispose(), то он должен будет реализовать интерфейс IDisposable, что в терминах С# означает, что он наследуется от IDisposable.
class SomeClass: IDisposable
{
// Этот класс ДОЛЖЕН содержать реализацию метода
// IDisposable.Dispose(), иначе вы получите ошибку компиляции
public void Dispose()
{ // реализация метода Dispose()
}
// остальная часть класса
}
В этом примере если SomeClass будет наследовать IDisposable, но не будет содержать реализации Dispose(), в точности совпадающей с сигнатурой, определенной в IDisposable, будет выдана ошибка компиляции, поскольку в этом случае класс нарушит контракт реализации интерфейса IDisposable. Конечно, для компилятора не будет никакой проблемы, если встретится класс, включающий метод Dispose(), но не унаследованный от IDisposable. Проблема будет в том, что другой код не будет иметь возможности распознать, что SomeClass согласен поддерживать средства IDisposable.
IDisposable - сравнительно простой интерфейс, потому что определяет только один метод. Большинство интерфейсов содержат большее число методов.