logo
CSharp_Prog_Guide

Индексаторы в интерфейсах

Индексаторы можно объявлять в интерфейсах. Между методами доступа индексаторов интерфейса и методами доступа индексаторов класса существуют следующие отличия:

Поэтому метод доступа предназначен для того, чтобы указывать, доступен ли индексатор для чтения и записи, только для чтения или только для записи.

Ниже приведен пример метода доступа индексатора интерфейса:

public interface ISomeInterface

{

//...

// Indexer declaration:

string this[int index]

{

get;

set;

}

}

Сигнатура индексатора должна отличаться от сигнатур всех других индексаторов, объявленных в том же интерфейсе.

Example

The following example shows how to implement interface indexers.

// Indexer on an interface:

public interface ISomeInterface

{

// Indexer declaration:

int this[int index]

{

get;

set;

}

}

// Implementing the interface.

class IndexerClass : ISomeInterface

{

private int[] arr = new int[100];

public int this[int index] // indexer declaration

{

get

{

// Check the index limits.

if (index < 0 || index >= 100)

{

return 0;

}

else

{

return arr[index];

}

}

set

{

if (!(index < 0 || index >= 100))

{

arr[index] = value;

}

}

}

}

Пример

В следующем примере показана реализация индексаторов интерфейса.

-----

class MainClass

{

static void Main()

{

IndexerClass test = new IndexerClass();

// Call the indexer to initialize the elements #2 and #5.

test[2] = 4;

test[5] = 32;

for (int i = 0; i <= 10; i++)

{

System.Console.WriteLine("Element #{0} = {1}", i, test[i]);

}

}

}

Output

Element #0 = 0 Element #1 = 0 Element #2 = 4 Element #3 = 0

Element #4 = 0 Element #5 = 32 Element #6 = 0 Element #7 = 0

Element #8 = 0 Element #9 = 0 Element #10 = 0

In the preceding example, you could use the explicit interface member implementation by using the fully qualified name of the interface member. For example:

public string ISomeInterface.this

{

}

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. 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. That is, the following indexer declaration:

public string IEmployee.this

{

}

implements the indexer on the IEmployee interface, while the following declaration:

public string ICitizen.this

{

}

implements the indexer on the ICitizen interface.

------