Antarmuka - menentukan perilaku untuk beberapa jenis

Antarmuka berisi definisi untuk sekelompok fungsi terkait yang tidak abstrak class atau harus struct diterapkan. Antarmuka dapat menentukan static metode, yang harus memiliki implementasi. Antarmuka dapat menentukan implementasi default untuk anggota. Antarmuka mungkin tidak mendeklarasikan data instans seperti bidang, properti yang diimplementasikan secara otomatis, atau peristiwa seperti properti.

Dengan menggunakan antarmuka, Anda dapat, misalnya, menyertakan perilaku dari beberapa sumber di kelas. Kemampuan tersebut penting dalam C# karena bahasa tidak mendukung beberapa pewarisan kelas. Selain itu, Anda harus menggunakan antarmuka jika ingin menyimulasikan pewarisan untuk struktur, karena mereka tidak dapat benar-benar mewarisi dari struktur atau kelas lain.

Anda menentukan antarmuka dengan menggunakan interface kata kunci seperti yang ditunjukkan contoh berikut.

interface IEquatable<T>
{
    bool Equals(T obj);
}

Nama antarmuka harus berupa nama pengidentifikasi C# yang valid. Menurut konvensi, nama antarmuka dimulai dengan modal I.

Setiap kelas atau struktur yang mengimplementasikan IEquatable<T> antarmuka harus berisi definisi untuk Equals metode yang cocok dengan tanda tangan yang ditentukan antarmuka. Akibatnya, Anda dapat mengandalkan kelas yang mengimplementasikan IEquatable<T> untuk berisi Equals metode yang instans kelasnya dapat menentukan apakah itu sama dengan instans lain dari kelas yang sama.

Definisi IEquatable<T> tidak menyediakan implementasi untuk Equals. Kelas atau struktur dapat mengimplementasikan beberapa antarmuka, tetapi kelas hanya dapat mewarisi dari satu kelas.

Untuk informasi selengkapnya tentang kelas abstrak, lihat Kelas Abstrak dan Tersegel serta Anggota Kelas.

Antarmuka dapat berisi metode instans, properti, peristiwa, pengindeks, atau kombinasi apa pun dari empat jenis anggota tersebut. Antarmuka mungkin berisi konstruktor statis, bidang, konstanta, atau operator. Dimulai dengan C# 11, anggota antarmuka yang bukan bidang mungkin static abstract. Antarmuka tidak dapat berisi bidang instans, konstruktor instans, atau finalizer. Anggota antarmuka bersifat publik secara default, dan Anda dapat secara eksplisit menentukan pengubah aksesibilitas, seperti public, , protected, internalprivate, protected internal, atau private protected. Anggota private harus memiliki implementasi default.

Untuk mengimplementasikan anggota antarmuka, anggota kelas pelaksana yang sesuai harus publik, non-statis, dan memiliki nama dan tanda tangan yang sama dengan anggota antarmuka.

Catatan

Saat antarmuka mendeklarasikan anggota statis, jenis yang mengimplementasikan antarmuka tersebut juga dapat mendeklarasikan anggota statis dengan tanda tangan yang sama. Itu berbeda dan diidentifikasi secara unik oleh jenis yang menyatakan anggota. Anggota statis yang dinyatakan dalam jenis tidak mengambil alih anggota statis yang dideklarasikan dalam antarmuka.

Kelas atau struktur yang mengimplementasikan antarmuka harus menyediakan implementasi untuk semua anggota yang dideklarasikan tanpa implementasi default yang disediakan oleh antarmuka. Namun, jika kelas dasar mengimplementasikan antarmuka, kelas apa pun yang berasal dari kelas dasar mewarisi implementasi tersebut.

Contoh berikut menunjukkan implementasi antarmuka IEquatable<T>. Kelas pelaksana, Car, harus menyediakan implementasi metode Equals.

public class Car : IEquatable<Car>
{
    public string? Make { get; set; }
    public string? Model { get; set; }
    public string? Year { get; set; }

    // Implementation of IEquatable<T> interface
    public bool Equals(Car? car)
    {
        return (this.Make, this.Model, this.Year) ==
            (car?.Make, car?.Model, car?.Year);
    }
}

Properti dan pengindeks kelas dapat menentukan aksesor tambahan untuk properti atau pengindeks yang ditentukan dalam antarmuka. Misalnya, antarmuka mungkin mendeklarasikan properti yang memiliki aksesor get. Kelas yang mengimplementasikan antarmuka dapat mendeklarasikan properti yang sama dengan get pengakses dan set. Namun, jika properti atau pengindeks menggunakan implementasi eksplisit, pengakses harus cocok. Untuk informasi selengkapnya tentang implementasi antarmuka eksplisit, lihat Implementasi Antarmuka Eksplisit dan Properti Antarmuka.

Antarmuka dapat mewarisi dari satu atau lebih antarmuka. Antarmuka turunan mewarisi anggota dari antarmuka dasarnya. Kelas yang mengimplementasikan antarmuka turunan harus mengimplementasikan semua anggota di antarmuka turunan, termasuk semua anggota antarmuka dasar antarmuka turunan. Kelas tersebut dapat dikonversi secara implisit ke antarmuka turunan atau antarmuka dasarnya. Kelas mungkin mencakup antarmuka beberapa kali melalui kelas dasar yang diwarisi atau melalui antarmuka yang diwarisi antarmuka lain. Namun, kelas dapat menyediakan implementasi antarmuka hanya satu kali dan hanya jika kelas mendeklarasikan antarmuka sebagai bagian dari definisi kelas (class ClassName : InterfaceName). Jika antarmuka diwariskan karena Anda mewarisi kelas dasar yang mengimplementasikan antarmuka, kelas dasar menyediakan implementasi anggota antarmuka. Namun, kelas turunan dapat melengkapi kembali anggota antarmuka virtual apa pun alih-alih menggunakan implementasi yang diwariskan. Saat antarmuka mendeklarasikan implementasi default metode, kelas apa pun yang mengimplementasikan antarmuka tersebut mewarisi implementasi tersebut (Anda perlu mentransmisikan instans kelas ke jenis antarmuka untuk mengakses implementasi default pada anggota Antarmuka).

Kelas dasar juga dapat mengimplementasikan anggota antarmuka dengan menggunakan anggota virtual. Dalam hal ini, kelas turunan dapat mengubah perilaku antarmuka dengan mengambil alih anggota virtual. Untuk informasi selengkapnya mengenai anggota virtual, lihat Polymorphism.

Ringkasan antarmuka

Antarmuka memiliki properti berikut:

  • Dalam versi C# yang lebih lama dari 8.0, antarmuka seperti kelas dasar abstrak dengan hanya anggota abstrak. Kelas atau struktur yang mengimplementasikan antarmuka harus mengimplementasikan semua anggotanya.
  • Dimulai dengan C# 8.0, antarmuka dapat menentukan implementasi default untuk beberapa atau semua anggotanya. Kelas atau struktur yang mengimplementasikan antarmuka tidak harus mengimplementasikan anggota yang memiliki implementasi default. Untuk informasi selengkapnya, lihat metode antarmuka default.
  • Antarmuka tidak dapat diinstansiasi secara langsung. Anggotanya diimplementasikan oleh kelas atau struktur apa pun yang mengimplementasikan antarmuka.
  • Kelas atau struktur dapat mengimplementasikan satu atau beberapa antarmuka. Kelas dapat mewarisi kelas dasar dan juga mengimplementasikan satu atau beberapa antarmuka.