Aplikasi kasir dapat menerima pembayaran dari banyak saluran: kartu kredit, transfer bank, e-wallet, hingga saluran baru yang hadir belakangan. Kode kasir tidak perlu mengetahui cara kerja tiap saluran; kode tersebut hanya butuh jaminan bahwa setiap saluran mampu memproses pembayaran dengan jumlah tertentu. Interface menyatakan jaminan itu sebagai kontrak perilaku. Section Pemrograman Berorientasi Objek sudah mengenalkan interface tingkat dasar; bab ini merangkum aturan pendefinisiannya secara utuh sebelum kita masuk ke fitur lanjutan.

Aturan Pendefinisian Interface #

Interface dideklarasikan dengan kata kunci interface, dan berdasarkan konvensi industri namanya diawali huruf I. Berikut kontrak pembayaran yang kita pakai sepanjang section ini:

csharp
public interface IPembayaran
{
    void ProsesPembayaran(int jumlah);
    int BiayaAdmin { get; }
}

Isi interface hanya menyatakan bentuk kemampuan, bukan cara kerjanya. Compiler menerapkan aturan berikut pada member di dalamnya:

  • Member bersifat public secara implisit, sehingga access modifier tidak ditulis di dalam interface.
  • Interface tidak boleh memiliki field dan tidak punya constructor.
  • Method hanya berupa signature tanpa badan, ditutup dengan titik koma.
  • Property boleh dideklarasikan untuk akses baca { get; } atau akses isi { set; }, dan implementer wajib menyediakannya sesuai deklarasi.

Kontrak di atas menjanjikan dua hal: setiap metode pembayaran mampu memproses jumlah tertentu lewat ProsesPembayaran, dan setiap metode membuka BiayaAdmin yang dapat dibaca pemanggil.

Interface sebagai Tipe #

Compiler memperlakukan interface yang sudah didefinisikan sebagai sebuah tipe, sama seperti class. Kita dapat mendeklarasikan variabel bertipe IPembayaran meskipun belum ada class yang mengisinya; variabel semacam itu bernilai null karena belum menunjuk object apa pun. Program berikut membuktikan kedua sifat tersebut:

csharp
IPembayaran kontrak = default;
Console.WriteLine($"Nilai default variabel IPembayaran: {(kontrak == null ? "null" : "terisi object")}");
Console.WriteLine($"IPembayaran adalah interface: {typeof(IPembayaran).IsInterface}");

Output yang Dihasilkan:

text
Nilai default variabel IPembayaran: null
IPembayaran adalah interface: True

Mari kita bedah baris demi baris:

  1. IPembayaran kontrak = default; — kata kunci default mengisi variabel referensi dengan nilai kosong, sehingga kontrak belum menunjuk object mana pun.
  2. kontrak == null — hasil True menegaskan bahwa variabel bertipe interface boleh berstatus kosong sebelum diberi implementasi.
  3. typeof(IPembayaran).IsInterface — runtime mengonfirmasi IPembayaran terdaftar sebagai interface, bukan class.
text
error CS0144: Cannot create an instance of the abstract type or interface 'IPembayaran'

Kontrak yang sudah didefinisikan belum melakukan apa pun sampai ada class yang mengisinya. Bab berikutnya membahas cara class menepati kontrak tersebut.