Поделиться через


Как явно реализовать элементы двух интерфейсов (руководство по программированию на C#)

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

Пример

// Declare the English units interface:
interface IEnglishDimensions
{
    float Length();
    float Width();
}

// Declare the metric units interface:
interface IMetricDimensions
{
    float Length();
    float Width();
}

// Declare the Box class that implements the two interfaces:
// IEnglishDimensions and IMetricDimensions:
class Box : IEnglishDimensions, IMetricDimensions
{
    float _lengthInches;
    float _widthInches;

    public Box(float lengthInches, float widthInches)
    {
        _lengthInches = lengthInches;
        _widthInches = widthInches;
    }

    // Explicitly implement the members of IEnglishDimensions:
    float IEnglishDimensions.Length() => _lengthInches;

    float IEnglishDimensions.Width() => _widthInches;

    // Explicitly implement the members of IMetricDimensions:
    float IMetricDimensions.Length() => _lengthInches * 2.54f;

    float IMetricDimensions.Width() => _widthInches * 2.54f;

    static void Main()
    {
        // Declare a class instance box1:
        Box box1 = new(30.0f, 20.0f);

        // Declare an instance of the English units interface:
        IEnglishDimensions eDimensions = box1;

        // Declare an instance of the metric units interface:
        IMetricDimensions mDimensions = box1;

        // Print dimensions in English units:
        Console.WriteLine($"Length(in): {eDimensions.Length()}");
        Console.WriteLine($"Width (in): {eDimensions.Width()}");

        // Print dimensions in metric units:
        Console.WriteLine($"Length(cm): {mDimensions.Length()}");
        Console.WriteLine($"Width (cm): {mDimensions.Width()}");
    }
}
/* Output:
    Length(in): 30
    Width (in): 20
    Length(cm): 76.2
    Width (cm): 50.8
*/

Надежное программирование

Если вы хотите сделать измерения по умолчанию в английских единицах, реализуйте методы Length и Width обычно, а также явным образом реализуйте методы Length и Width из интерфейса IMetricDimensions:

// Normal implementation:
public float Length() => _lengthInches;
public float Width() => _widthInches;

// Explicit implementation:
float IMetricDimensions.Length() => _lengthInches * 2.54f;
float IMetricDimensions.Width() => _widthInches * 2.54f;

В этом случае можно получить доступ к единицам английского языка из экземпляра класса и получить доступ к единицам метрик из экземпляра интерфейса:

public static void Test()
{
    Box box1 = new(30.0f, 20.0f);
    IMetricDimensions mDimensions = box1;

    Console.WriteLine($"Length(in): {box1.Length()}");
    Console.WriteLine($"Width (in): {box1.Width()}");
    Console.WriteLine($"Length(cm): {mDimensions.Length()}");
    Console.WriteLine($"Width (cm): {mDimensions.Width()}");
}

См. также