Indexeerfuncties in interfaces (C#-programmeerhandleiding)
Indexeerfuncties kunnen worden gedeclareerd op een interface. Accessors van interface-indexeerfuncties verschillen op de volgende manieren van de accessors van klasse-indexeerfuncties :
- Interfacetoegangsors gebruiken geen modifiers.
- Een interface-accessor heeft doorgaans geen hoofdtekst.
Het doel van de accessor is om aan te geven of de indexeerfunctie alleen-lezen, alleen-lezen of alleen-schrijven is. U kunt een implementatie bieden voor een indexeerfunctie die is gedefinieerd in een interface, maar dit is zeldzaam. Indexeerfuncties definiëren doorgaans een API voor toegang tot gegevensvelden en gegevensvelden kunnen niet worden gedefinieerd in een interface.
Hier volgt een voorbeeld van een interface-indexeerfunctietoegangsfunctie:
public interface ISomeInterface
{
//...
// Indexer declaration:
string this[int index]
{
get;
set;
}
}
De handtekening van een indexeerfunctie moet verschillen van de handtekeningen van alle andere indexeerfuncties die in dezelfde interface zijn gedeclareerd.
Opmerking
In het volgende voorbeeld ziet u hoe u interface-indexeerfuncties implementeert.
// 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
*/
In het voorgaande voorbeeld kunt u de expliciete implementatie van interfaceleden gebruiken met behulp van de volledig gekwalificeerde naam van het interfacelid. Bijvoorbeeld
string IIndexInterface.this[int index]
{
}
De volledig gekwalificeerde naam is echter alleen nodig om dubbelzinnigheid te voorkomen wanneer de klasse meer dan één interface met dezelfde indexeerfunctiehandtekening implementeert. Als een Employee
klasse bijvoorbeeld twee interfaces ICitizen
implementeert en , en IEmployee
beide interfaces dezelfde indexeerfunctiehandtekening hebben, is de expliciete implementatie van interfaceleden nodig. Dat wil gezegd, de volgende indexeerfunctiedeclaratie:
string IEmployee.this[int index]
{
}
Implementeert de indexeerfunctie op de IEmployee
interface, terwijl de volgende declaratie:
string ICitizen.this[int index]
{
}
Implementeert de indexeerfunctie op de ICitizen
interface.