Pengindeks di Antarmuka (Panduan Pemrograman C#)
Pengindeks dapat dideklarasikan pada antarmuka. Pengakses pengindeks antarmuka berbeda dari pengakses pengindeks kelas terkait hal-hal berikut:
- Aksesor antarmuka tidak menggunakan pengubah.
- Aksesor antarmuka biasanya tidak memiliki isi.
Tujuan pengakses adalah menunjukkan jika pengindeks adalah baca-tulis, baca-saja, atau tulis-saja. Anda dapat memberikan implementasi untuk pengindeks yang ditentukan dalam antarmuka, tetapi ini jarang terjadi. Pengindeks biasanya menentukan API untuk mengakses bidang data, dan bidang data tidak dapat ditentukan dalam antarmuka.
Berikut ini adalah contoh pengakses pengindeks antarmuka:
public interface ISomeInterface
{
//...
// Indexer declaration:
string this[int index]
{
get;
set;
}
}
Tanda tangan pengindeks harus berbeda dari tanda tangan semua pengindeks lain yang dinyatakan dalam antarmuka yang sama.
Contoh
Contoh berikut menunjukkan cara menerapkan pengindeks antarmuka.
// 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
*/
Dalam contoh sebelumnya, Anda dapat menggunakan implementasi anggota antarmuka eksplisit dengan menggunakan nama anggota antarmuka yang sepenuhnya memenuhi syarat. Misalnya
string IIndexInterface.this[int index]
{
}
Namun, nama yang sepenuhnya memenuhi syarat hanya diperlukan untuk menghindari ambiguitas ketika kelas menerapkan lebih dari satu antarmuka dengan tanda tangan pengindeks yang sama. Misalnya, jika kelas Employee
menerapkan dua antarmuka, ICitizen
dan IEmployee
, serta kedua antarmuka memiliki tanda tangan pengindeks yang sama, implementasi anggota antarmuka eksplisit akan diperlukan. Yaitu, deklarasi pengindeks berikut:
string IEmployee.this[int index]
{
}
Menerapkan pengindeks pada IEmployee
antarmuka, sementara deklarasi berikut:
string ICitizen.this[int index]
{
}
Mengimplementasikan pengindeks pada ICitizen
antarmuka.