Share via


Como implementar membros de duas interfaces explicitamente (Guia de Programação em C#)

Explícito interface implementação também permite que o programador implementar duas interfaces que têm os mesmos nomes de membro e fornecer uma implementação separada de cada membro de interface. Este exemplo exibe as dimensões de uma caixa de métrica e unidades em inglês. A caixa de classe implementa duas interfaces IEnglishDimensions e IMetricDimensions, que representam os sistemas de medida diferente. Ambas as interfaces têm nomes de membro idênticos, comprimento e largura.

Exemplo

// 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 length, float width)
    {
        lengthInches = length;
        widthInches = width;
    }

    // Explicitly implement the members of IEnglishDimensions: 
    float IEnglishDimensions.Length()
    {
        return lengthInches;
    }

    float IEnglishDimensions.Width()
    {
        return widthInches;
    }

    // Explicitly implement the members of IMetricDimensions: 
    float IMetricDimensions.Length()
    {
        return lengthInches * 2.54f;
    }

    float IMetricDimensions.Width()
    {
        return widthInches * 2.54f;
    }

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

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

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

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

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

Programação robusta

Se você desejar fazer medições padrão em unidades de inglês, implementar os métodos de comprimento e largura normalmente e implementar explicitamente os métodos de comprimento e largura da interface IMetricDimensions:

// Normal implementation: 
public float Length()
{
    return lengthInches;
}
public float Width()
{
    return widthInches;
}

// Explicit implementation: 
float IMetricDimensions.Length()
{
    return lengthInches * 2.54f;
}
float IMetricDimensions.Width()
{
    return widthInches * 2.54f;
}

Nesse caso, você pode acessar as unidades em inglês da instância da classe e acessar as unidades métricas de instância da interface:

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

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

Consulte também

Tarefas

Como implementar membros de interface explicitamente (Guia de Programação em C#)

Referência

Classes e structs (Guia de Programação em C#)

Interfaces (Guia de Programação em C#)

Conceitos

Guia de Programação em C#