Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os indexadores podem ser declarados em uma interface. Os acessadores de indexadores de interface diferem dos acessadores de indexadores de classe das seguintes maneiras:
- Os acessadores de interface não usam modificadores.
- Um acessador de interface normalmente não tem um corpo.
O objetivo do acessador é indicar se o indexador é leitura-gravação, somente leitura ou somente gravação. Você pode fornecer uma implementação para um indexador definido em uma interface, mas isso é raro. Os indexadores normalmente definem uma API para acessar campos de dados, e os campos de dados não podem ser definidos em uma interface.
Segue-se um exemplo de um acessador indexador de interface:
public interface ISomeInterface
{
//...
// Indexer declaration:
string this[int index]
{
get;
set;
}
}
A assinatura de um indexador deve diferir das assinaturas de todos os outros indexadores declarados na mesma interface.
Exemplo
O exemplo a seguir mostra como implementar indexadores de interface.
// 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 = System.Random.Shared;
// 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, você pode usar a implementação explícita do membro da interface usando o nome totalmente qualificado do membro da interface. Por exemplo
string IIndexInterface.this[int index]
{
}
No entanto, o nome totalmente qualificado só é necessário para evitar ambiguidade quando a classe está implementando mais de uma interface com a mesma assinatura de indexador. Por exemplo, se uma Employee classe estiver implementando duas interfaces ICitizen e IEmployee, e ambas as interfaces tiverem a mesma assinatura de indexador, a implementação explícita do membro da interface será necessária. Ou seja, a seguinte declaração de indexador:
string IEmployee.this[int index]
{
}
Implementa o indexador na IEmployee interface, enquanto a seguinte declaração:
string ICitizen.this[int index]
{
}
Implementa o indexador na ICitizen interface.