Изучение реализации интерфейса по умолчанию

Завершено

Реализации интерфейса по умолчанию позволяют добавлять новые методы непосредственно в интерфейс и предоставлять реализацию по умолчанию. Класс, использующий этот интерфейс, может использовать метод по умолчанию или переопределить и предоставить собственную реализацию.

Реализации по умолчанию

Реализации по умолчанию в интерфейсах позволяют добавлять новые методы в интерфейс без возникновения проблем.

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

Замечание

Даже при реализации по умолчанию класс не получает методы интерфейса автоматически. Чтобы использовать метод из интерфейса, переменная должна иметь тип интерфейса.

Преимущества

Реализации по умолчанию в интерфейсах имеют несколько преимуществ:

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

Например, предположим, что вы работаете с системой управления клиентами и добавляете новый метод для применения скидки на лояльность в существующем интерфейсе. Метод по умолчанию вычисляет базовую скидку. Но если класс "VIP-клиент" требует другого вычисления, он может изменить этот метод.

Определение реализаций по умолчанию

Синтаксис для определения реализаций по умолчанию в интерфейсах расширяет объявление интерфейса, включая тела методов. В следующем примере определяется реализация по умолчанию в интерфейсе на основе сценария системы управления клиентами:

interface ICustomer
{
    int CustomerId { get; set; } // No default implementation

    void ApplyLoyaltyDiscount() 
    { 
        // default implementation
        Console.WriteLine("Applying 10% loyalty discount."); 
    }
}

В этом примере ApplyLoyaltyDiscount метод имеет реализацию по умолчанию в интерфейсе ICustomer . Свойство CustomerId также определено в интерфейсе, но не имеет реализации по умолчанию.

Замечание

Начиная с C# 8.0 интерфейсы могут включать реализации методов по умолчанию. Это изменение позволяет добавлять новые методы в интерфейсы без нарушения существующего кода. Классы могут использовать эти значения по умолчанию или предоставлять собственные реализации.

Затем реализуйте класс VIPCustomer, который требует другого вычисления скидки. Этот класс может реализовать ICustomer интерфейс, предоставить собственную реализацию для CustomerId свойства и переопределить ApplyLoyaltyDiscount метод следующим образом:

class VIPCustomer : ICustomer
{
    public int CustomerId { get; set; } // Implementing property from interface

    void ICustomer.ApplyLoyaltyDiscount()
    {
        // override default implementation for VIP customers
        Console.WriteLine($"Applying 20% loyalty discount for VIP customer with ID {CustomerId}.");
    }
}

В этом случае класс VIPCustomer применяет скидку 20% вместо стандартной скидки 10%. Используется в сообщении при применении скидки CustomerId.

Реализации по умолчанию в интерфейсах позволяют добавлять новые методы с реализацией метода, предоставленной в интерфейсе. Реализации по умолчанию повышают повторное использование кода, обратную совместимость и гибкость. Это практический инструмент в C# Object-Oriented Программирование, которое повышает адаптируемость, не нарушая существующий код.