interface(Referensi C#)
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 bisa menentukan static
anggota untuk menyediakan satu implementasi untuk fungsionalitas umum. Dimulai dengan C# 11, 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
.
Untuk informasi dan contoh selengkapnya, lihat Antarmuka.
Contoh antarmuka
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();
}
}
Antarmuka bisa berupa anggota ruang nama atau kelas. Deklarasi antarmuka bisa berisi deklarasi (tanda tangan tanpa implementasi apa pun) dari anggota berikut:
Anggota antarmuka default
Deklarasi anggota sebelumnya ini biasanya tidak berisi isi. 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. Antarmuka dapat mencakup:
- Konstanta
- Operator
- Konstruktor statis.
- Jenis Berlapis
- Bidang statis, metode, properti, pengindeks, dan peristiwa
- Deklarasi anggota menggunakan sintaks implementasi antarmuka eksplisit.
- Pengubah akses eksplisit (akses defaultnya adalah
public
).
Abstrak statis dan anggota virtual
Dimulai dengan C# 11, 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 diimplementasikan 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 int
INumber<int>
. Ketika parameter T
jenis menunjukkan argumen int
jenis , 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) akan dipanggil.
Anda bisa mencoba fitur ini dengan bekerja dengan tutorial tentang anggota abstrak statis di antarmuka.
Pewarisan antarmuka
Antarmuka mungkin tidak 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. 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 Antarmuka dari spesifikasi bahasa C#, spesifikasi fitur untuk C# 8 - Anggota antarmuka default, dan spesifikasi fitur untuk C# 11 - anggota abstrak statis di antarmuka
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk