Содержание
Когда мы разбирали тему про наследование классов в C#, то было сказано, что классы наследуются последовательно — один класс не может наследовать несколько классов-предков. Что же касается интерфейсов, то одно из ключевых преимуществ, которые дают нам интерфейсы заключается в том, что один класс может реализовывать сразу несколько интерфейсов. Более того, сами интерфейсы могут наследовать другие интерфейсы.
Наследование интерфейсов
В C# один интерфейс может быть унаследован от другого интерфейса. Например, рассмотрим следующую иерархию типов:
interface IEntity
{
string Id { get; }
string Name { get; }
}
interface IPerson : IEntity
{
string LastName { get; }
}
interface IBank : IEntity
{
string Address { get; }
}
Здесь интерфейс IEntity является базовым для интерфейсов IPerson и IBank. Теперь класс, реализующий какой-либо интерфейс должен реализовать все члены этого интерфейса, включая и базовый. Например, создадим класс, реализующий IPerson. Как только мы укажем для нового класса интерфейс, то Visual Studio сразу покажет нам следующие ошибки:
Так как IPerson унаследован от IEntity, то в нашем классе мы должны реализовать и свойства непосредственно интерфейса IPerson и свойства интерфейса IEntity. Таким образом, окончательный код класса может выглядеть следующим образом:
class Person : IPerson
{
public string LastName { get; set; }
public string Id { get; set; }
public string Name { get; set; }
}
Множественная реализация интерфейсов
Теперь вернемся к предыдущей части в которой мы разработали интерфейс
interface IMoneyVault
{
int MoneyAdd(int count);
int MoneyRemove(int count);
}
Благодаря тому, что интерфейсы в C# поддерживают множественную реализацию, мы можем добавить в наш класс Person дополнительную функциональность:
class Person : IPerson, IMoneyVault
{
private int currentMoney;
public string LastName { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public int MoneyAdd(int count)
{
return currentMoney += count;
}
public int MoneyRemove(int count)
{
return currentMoney -= count;
}
}
Таким образом мы можем реализовывать несколько интерфейсов в одном классе. Более того, используя механизм наследования, класс может наследовать другой класс и одновременно реализовывать интерфейсы.
Одновременное наследование класса и реализация интерфейсов
Класс C# может наследоваться от одного базового класса и реализовывать несколько интерфейсов. Например,
class BaseClass
{
public void PrintText(string text)
{
Console.WriteLine(text);
}
}
class Person : BaseClass, IPerson, IMoneyVault
{
private int currentMoney;
public string LastName { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public int MoneyAdd(int count)
{
return currentMoney += count;
}
public int MoneyRemove(int count)
{
return currentMoney -= count;
}
}
Теперь класс Person стал наследником класса BaseClass и одновременно реализует два интерфейса. При таком подходе следует учитывать, что базовый класс всегда указывается перед интерфейсами, то есть вот такой код вызовет ошибку:
class Person : IPerson, IMoneyVault, BaseClass //базовый класс стоит после интерфейсов
{
}
Итого
В C# допускается наследование одного интерфейса от другого, при этом класс, реализующий производный интерфейс должен реализовывать все члены этого интерфейса, включая методы, свойства и т.д. интерфейса-предка. Также в C# допускается множественная реализация интерфейсов — один класс может реализовать сразу несколько интерфейсов.

