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:
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:
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:
Nilai default variabel IPembayaran: null
IPembayaran adalah interface: TrueMari kita bedah baris demi baris:
IPembayaran kontrak = default;— kata kuncidefaultmengisi variabel referensi dengan nilai kosong, sehinggakontrakbelum menunjuk object mana pun.kontrak == null— hasilTruemenegaskan bahwa variabel bertipe interface boleh berstatus kosong sebelum diberi implementasi.typeof(IPembayaran).IsInterface— runtime mengonfirmasiIPembayaranterdaftar sebagai interface, bukan class.
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.