Интерфейсы в C#

Интерфейсы в C#

DailyDev

Всем привет! Сегодня я бы хотел рассказать вам про интерфейсы в языке C#. Интерфейсы позволяют нам полностью отделять имена и сигнатуры методов класса от их реализации, что является полезной технологией для создания сложных программ, структуризации проекта в целом.

Немного теории

Интерфейс содержит определения для группы связанных функциональных возможностей, которые может реализовать класс или структура.

Что это означает? Это означает что интерфейс показывает производному классу какие методы он должен иметь и реализовывать. Насколько вы знаете, класс может иметь только один базовый класс, однако класс может наследоваться от бесконечного числа интерфейсов.

Интерфейс не может содержать определение методов, иметь конструкторы, так как мы не можем создать экземпляр интерфейса.

В общем случае, интерфейсы позволяют создать шаблон проектирования класса. Это может быть особенно полезно когда вы работаете в команде.

По умолчанию, все методы интерфейса имеют модификаторы доступа public. По сути, если подумать, то других модификаторов быть и не может, так как интерфейс создан для того чтобы его методы наследовали.

Перейдем к практике

Напишем простое наследование от интерфейса.

class Main : ITest
{
    public void SomeMethod()
    {
        Console.WriteLine("Hello World!");
    }
}
interface ITest
{
    void SomeMethod();
}

В данном примере мы создали интерфейс под названием ITest в котором объявлен (но не определён) метод SomeMethod, как мы видим, он не имеет реализации. Класс Main наследуется от этого интерфейса, и соответственно, он обязан реализовать данный метод.

Так же, как мы можем ссылаться на объект с помощью использования переменной определенной как класс которая стоит выше в иерархии, мы можем сослаться на объект путем использования переменной определенной как интерфейс.

class Main : ITest
{
    ITest obj = new Main(); // Main находиться ниже по иерархии
    public void SomeMethod()
    {
        Console.WriteLine("Hello World!");
    }
    public static void Main()
    {
        Main obj = new Main(); 
        ITest obj2 = obj;
    }
interface ITest
{
    void SomeMethod();
}

Как мы видим, мы можем привести объект типа Main к типу ITest так как интерфейс ITest находиться выше по иерархии наследования. Зачем мы можем это использовать? Например, мы можем использовать это для того чтобы проверить соответствует ли определенному типу передаваемый параметр для функции.

class Test : ITest
{ 
    public void SomeMethod(ITest obj)
    {

    }
}

interface ITest
{
    void SomeMethod(ITest p);
}

В данном случае мы будем уверены что тип объект obj наследовался от интерфейса ITest.

С помощью ключевого слова is мы можем проверить факт реализации интерфейса для класса проверяемого объекта.

class Test : ITest
{ 
    public void SomeMethod(ITest obj)
    {
        if(obj is ITest) 
            Console.WriteLine("Yes, obj is 'Test' object");
    }
}

interface ITest
{
    void SomeMethod(ITest p);
}

Также следует упомянуть про явную реализация интерфейсов. Это необходимо если мы наследуем класс от множества интерфейсов в которых присутствуют методы с одинаковыми именами. Выглядит это так:

class Test : ITest, ITest2
{
    void ITest.SomeMethod(ITest obj)
    {
        Console.WriteLine("Hello World!");
    }

    void ITest2.SomeMethod(ITest p)
    {
        Console.WriteLine("Hello World 2!");
    }
}

interface ITest
{
    void SomeMethod(ITest p);
}
interface ITest2
{
    void SomeMethod(ITest p);
}

В таком случае, при реализации данных методов, мы больше не указываем модификатор доступа public, так как при создании экземпляра класса и попытке вызова функции извне, у нас было бы перекрытие имен.

Заключение

В заключение можно сказать что интерфейсы значительно расширяют возможности ООП. Благодаря им, мы можем создавать шаблоны проектирования для классов и зачастую упрощать свою работу. Как всегда, я оставлю полезные ссылки на дополнительные материалы.

Полезные ссылки:

https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/interfaces/ - официальный сайт microsoft docs


Report Page