Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Antarmuka mendefinisikan kontrak. Setiap class, record, atau struct yang mengimplementasikan kontrak tersebut harus menyediakan implementasi anggota yang ditentukan dalam antarmuka.
Antarmuka dapat menentukan implementasi default untuk anggota. Ini juga dapat menentukan static anggota untuk memberikan satu implementasi untuk fungsionalitas umum.
Antarmuka dapat menentukan static abstract atau static virtual anggota untuk menyatakan bahwa jenis penerapan harus menyediakan anggota yang dideklarasikan. Biasanya, static virtual metode menyatakan bahwa implementasi harus menentukan sekumpulan operator yang kelebihan beban.
Dalam contoh berikut, kelas ImplementationClass harus menerapkan metode bernama SampleMethod yang tidak memiliki parameter dan mengembalikan void.
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
// Explicit interface member implementation:
void ISampleInterface.SampleMethod()
{
// Method implementation.
}
static void Main()
{
// Declare an interface instance.
ISampleInterface obj = new ImplementationClass();
// Call the member.
obj.SampleMethod();
}
}
Untuk informasi dan contoh selengkapnya, lihat Antarmuka.
Pengubah akses
Antarmuka bisa berupa anggota ruang nama atau kelas. Antarmuka tingkat atas, satu dideklarasikan dalam namespace tetapi tidak bersarang di dalam jenis lain, dapat dideklarasikan public atau internal. Default adalah internal. Deklarasi antarmuka berlapis, dinyatakan di dalam jenis lain, dapat dinyatakan menggunakan pengubah akses apa pun.
Anggota antarmuka tanpa implementasi (anggota abstrak) secara public implisit dan tidak dapat memiliki pengubah akses lainnya. Anggota antarmuka dengan implementasi default secara private default jika tidak ada pengubah akses yang ditentukan, tetapi dapat dideklarasikan dengan pengubah akses apa pun (public, private, protected, atau internal).
Anggota antarmuka
Deklarasi antarmuka dapat berisi anggota berikut:
- Metode.
- Properti.
- Pengindeks.
- Peristiwa.
- Konstanta.
- Operator.
- Konstruktor statis.
- Jenis berlapis.
- Bidang statis, metode, properti, pengindeks, dan peristiwa.
- Pengubah akses eksplisit (akses default untuk metode abstrak adalah
public).
Anggota antarmuka default
Deklarasi anggota biasanya tidak berisi isi, namun, anggota antarmuka dapat mendeklarasikan isi. Badan anggota dalam antarmuka adalah implementasi default. Anggota dengan badan mengizinkan antarmuka untuk menyediakan implementasi "default" untuk kelas dan struktur yang tidak memberikan implementasi yang mengesampingkan.
Penting
Menambahkan anggota antarmuka default memaksa apa pun ref struct yang mengimplementasikan antarmuka untuk menambahkan deklarasi eksplisit anggota tersebut.
Abstrak statis dan anggota virtual
Antarmuka dapat mendeklarasikan static abstract dan static virtual anggota untuk semua jenis anggota kecuali bidang. Antarmuka dapat menyatakan bahwa jenis penerapan harus menentukan operator atau anggota statis lainnya. Fitur ini memungkinkan algoritma generik untuk menentukan perilaku seperti angka. Anda dapat melihat contoh dalam jenis numerik di runtime .NET, seperti System.Numerics.INumber<TSelf>. Antarmuka ini menentukan operator matematika umum yang diterapkan oleh banyak jenis numerik. Pengkompilasi harus menyelesaikan panggilan ke static virtual dan static abstract metode pada waktu kompilasi. Metode static virtual dan static abstract yang dideklarasikan dalam antarmuka tidak memiliki mekanisme pengiriman runtime yang dianalogikan ke virtual atau abstract metode yang dideklarasikan dalam kelas. Sebagai gantinya, pengkompilasi menggunakan informasi jenis yang tersedia pada waktu kompilasi. Oleh karena itu, static virtual metode hampir dideklarasikan secara eksklusif dalam antarmuka generik. Selain itu, sebagian besar antarmuka yang menyatakan static virtual atau static abstract metode menyatakan bahwa salah satu parameter jenis harus mengimplementasikan antarmuka yang dideklarasikan. Misalnya, INumber<T> antarmuka menyatakan bahwa T harus menerapkan INumber<T>. Pengkompilasi menggunakan argumen jenis untuk menyelesaikan panggilan ke metode dan operator yang dideklarasikan dalam deklarasi antarmuka. Misalnya, jenis mengimplementasikan intINumber<int>. Ketika parameter T jenis menunjukkan argumen intjenis , anggota yang static dinyatakan dipanggil int . Atau, ketika double adalah argumen jenis, anggota yang static dinyatakan pada double jenis dipanggil.
Penting
Pengiriman metode untuk static abstract metode dan static virtual yang dideklarasikan dalam antarmuka diselesaikan menggunakan jenis waktu kompilasi ekspresi. Jika jenis runtime ekspresi berasal dari jenis waktu kompilasi yang berbeda, metode statis pada jenis dasar (waktu kompilasi) dipanggil.
Anda bisa mencoba fitur ini dengan bekerja dengan tutorial tentang anggota abstrak statis di antarmuka.
Pewarisan antarmuka
Antarmuka tidak dapat berisi status instans. Meskipun bidang statis sekarang diizinkan, bidang instans tidak diizinkan dalam antarmuka.
Properti otomatis instans tidak didukung dalam antarmuka, karena secara implisit akan mendeklarasikan bidang tersembunyi. Aturan ini memiliki efek halus pada deklarasi properti. Dalam deklarasi antarmuka, kode berikut tidak mendeklarasikan properti yang diimplementasikan secara otomatis seperti dalam class atau struct. Sebaliknya, ia mendeklarasikan properti yang tidak memiliki implementasi default tetapi harus diimplementasikan dalam jenis apa pun yang mengimplementasikan antarmuka:
public interface INamed
{
public string Name {get; set;}
}
Antarmuka bisa mewarisi dari satu atau lebih antarmuka dasar. Ketika antarmuka mewarisi dari antarmuka lain, jenis yang mengimplementasikan antarmuka turunan harus mengimplementasikan semua anggota di antarmuka dasar selain anggota yang dideklarasikan dalam antarmuka turunan, seperti yang ditunjukkan dalam kode berikut:
public interface I1
{
void M1();
}
public interface I2 : I1
{
void M2();
}
public class C : I2
{
// implements I1.M1
public void M1() { }
// implements I2.M2
public void M2() { }
}
Saat antarmuka mengambil alih metode yang diterapkan dalam antarmuka dasar, antarmuka harus menggunakan sintaks implementasi antarmuka eksplisit.
Saat daftar tipe dasar berisi kelas dasar dan antarmuka, kelas dasar harus menjadi yang pertama dalam daftar.
Kelas yang mengimplementasikan antarmuka bisa secara eksplisit mengimplementasikan anggota antarmuka itu. Anggota yang diimplementasikan secara eksplisit tidak dapat diakses melalui instans kelas, tetapi hanya melalui instans antarmuka. Selain itu, anggota antarmuka default hanya bisa diakses melalui instance antarmuka.
Untuk informasi selengkapnya tentang implementasi antarmuka eksplisit, lihat Implementasi Antarmuka Eksplisit.
Contoh implementasi antarmuka
Contoh berikut menunjukkan implementasi antarmuka. Dalam contoh ini, antarmuka berisi deklarasi properti dan kelas berisi implementasi. Setiap instans kelas yang menerapkan memiliki properti IPoint bilangan x bulat dan y.
interface IPoint
{
// Property signatures:
int X { get; set; }
int Y { get; set; }
double Distance { get; }
}
class Point : IPoint
{
// Constructor:
public Point(int x, int y)
{
X = x;
Y = y;
}
// Property implementation:
public int X { get; set; }
public int Y { get; set; }
// Property implementation
public double Distance =>
Math.Sqrt(X * X + Y * Y);
}
class MainClass
{
static void PrintPoint(IPoint p)
{
Console.WriteLine("x={0}, y={1}", p.X, p.Y);
}
static void Main()
{
IPoint p = new Point(2, 3);
Console.Write("My Point: ");
PrintPoint(p);
}
}
// Output: My Point: x=2, y=3
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian Antarmukadari spesifikasi bahasa C# dan spesifikasi fitur untuk anggota abstrak statis dalam antarmuka.