Наследование и множественная реализация интерфейсов

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии