Содержание
Когда мы разбирали тему про наследование классов в 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# допускается множественная реализация интерфейсов — один класс может реализовать сразу несколько интерфейсов.