Интерфейсы языка C#, отличие от С++

Языки Java и C# не поддерживают множественное реализационное наследование, как, скажем С++. Интерфейс в С#, в отличии от интерфейса в С++, не является абстрактным классом. Интерфейс C# — именованый набор методов, свойств и событий которые должны быть реализованы классом, поддерживающим данный интерфейс. Интерфейс не является пользовательским типом данных; нельзя создать экземпляр интерфейса, следовательно, интерфейс не может содержать данных, в отличие от С++.

Все методы интерфейса считаются публичными, соответсвено методы, реализующие интерфейс, всегда должны иметь уровень доступа public, в отличие от C++, где ничто не мешает определить виртуальный метод c уровнем доступа  protected. Попытка явно указать уровень доступа в интерфейсе C# приведет к ошибке компиляции.

public interface IListener
{
    int State { get; }
    void Notify(int code);
}

.class interface public abstract auto ansi Interfaces.IListener
{
  .method public hidebysig newslot specialname abstract virtual 
          instance int32  get_State() cil managed
  {
  } 

  .method public hidebysig newslot abstract virtual 
          instance void  Notify(int32 code) cil managed
  {
  } 

  .property instance int32 State()
  {
    .get instance int32 Interfaces.IListener::get_State()
  } 
} 

Об особенностях реализации интерфейсов в следующей главе.