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:

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 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) 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