Indexadores em interfaces (Guia de Programação em C#)Indexers in Interfaces (C# Programming Guide)

Os indexadores podem ser declarados em uma interface.Indexers can be declared on an interface. Acessadores de indexadores de interface diferem dos acessadores de indexadores de classe das seguintes maneiras:Accessors of interface indexers differ from the accessors of class indexers in the following ways:

  • Os acessadores de interface não usam modificadores.Interface accessors do not use modifiers.
  • Um acessador de interface normalmente não tem um corpo.An interface accessor typically does not have a body.

A finalidade do acessador é indicar se o indexador é de leitura/gravação, somente leitura ou somente gravação.The purpose of the accessor is to indicate whether the indexer is read-write, read-only, or write-only. Você pode fornecer uma implementação para um indexador definido em uma interface, mas isso é raro.You may provide an implementation for an indexer defined in an interface, but this is rare. Normalmente, os indexadores definem uma API para acessar os campos de dados e os campos de dados não podem ser definidos em uma interface.Indexers typically define an API to access data fields, and data fields cannot be defined in an interface.

Este é um exemplo de um acessador de indexador de interface:The following is an example of an interface indexer accessor:

public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}

A assinatura de um indexador deve ser diferente das assinaturas de todos os outros indexadores declarados na mesma interface.The signature of an indexer must differ from the signatures of all other indexers declared in the same interface.

ExemploExample

O exemplo a seguir mostra como implementar indexadores de interface.The following example shows how to implement interface indexers.

// Indexer on an interface:
public interface IIndexInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : IIndexInterface
{
    private int[] arr = new int[100];
    public int this[int index]   // indexer declaration
    {
        // The arr object will throw IndexOutOfRange exception.
        get => arr[index];
        set => arr[index] = value;
    }
}
IndexerClass test = new IndexerClass();
System.Random rand = new System.Random();
// Call the indexer to initialize its elements.
for (int i = 0; i < 10; i++)
{
    test[i] = rand.Next();
}
for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine($"Element #{i} = {test[i]}");
}

/* Sample output:
    Element #0 = 360877544
    Element #1 = 327058047
    Element #2 = 1913480832
    Element #3 = 1519039937
    Element #4 = 601472233
    Element #5 = 323352310
    Element #6 = 1422639981
    Element #7 = 1797892494
    Element #8 = 875761049
    Element #9 = 393083859
*/

No exemplo anterior, é possível usar a implementação de membro de interface explícita usando o nome totalmente qualificado do membro de interface.In the preceding example, you could use the explicit interface member implementation by using the fully qualified name of the interface member. Por exemploFor example

string IIndexInterface.this[int index]
{
}

No entanto, o nome totalmente qualificado só será necessário para evitar ambiguidade quando a classe estiver implementando mais de uma interface com a mesma assinatura do indexador.However, the fully qualified name is only needed to avoid ambiguity when the class is implementing more than one interface with the same indexer signature. Por exemplo, se uma classe Employee estiver implementando dois interfaces, ICitizen e IEmployee, e as duas interfaces tiverem a mesma assinatura de indexador, a implementação de membro de interface explícita é necessária.For example, if an Employee class is implementing two interfaces, ICitizen and IEmployee, and both interfaces have the same indexer signature, the explicit interface member implementation is necessary. Ou seja, a seguinte declaração de indexador:That is, the following indexer declaration:

string IEmployee.this[int index]
{
}

implementa o indexador na interface IEmployee, enquanto a seguinte declaração:implements the indexer on the IEmployee interface, while the following declaration:

string ICitizen.this[int index]
{
}

implementa o indexador na interface ICitizen.implements the indexer on the ICitizen interface.

Veja tambémSee also