Manajemen ingin menambahkan pembayaran QRIS. Saluran baru ini butuh kemampuan tambahan: membuat kode QR sebelum memproses pembayaran. Menambahkan member baru langsung pada IPembayaran akan memaksa semua class lama ikut berubah, padahal hanya QRIS yang membutuhkannya. Interface inheritance menawarkan jalan yang lebih aman: interface baru mewarisi interface lama, lalu menambahkan member miliknya sendiri.
Mendefinisikan Interface Turunan #
Deklarasi interface turunan memakai tanda titik dua, sama seperti pada class:
public interface IPembayaranQris : IPembayaran
{
string BuatKodeQr(int jumlah);
}
public class QrisMerchant : IPembayaranQris
{
public int BiayaAdmin => 500;
public string BuatKodeQr(int jumlah)
{
return $"QRIS-{jumlah}-MERCHANT77";
}
public void ProsesPembayaran(int jumlah)
{
Console.WriteLine($"QRIS: pembayaran Rp{jumlah} terverifikasi.");
}
}IPembayaranQris mewarisi seluruh member IPembayaran, sehingga kontrak turunannya berisi tiga member: ProsesPembayaran, BiayaAdmin, dan BuatKodeQr. Compiler memperlakukan rantai ini sebagai perluasan kontrak: member induk ikut menjadi bagian dari kontrak turunan, lengkap dengan sifat aksesnya yang tetap public. Class QrisMerchant wajib mengisi ketiganya; compiler menolak program bila member induk ada yang tertinggal.
Interface Turunan Tetap Berlaku sebagai Induknya #
Setiap class yang menepati kontrak turunan otomatis menepati kontrak induknya:
IPembayaranQris qris = new QrisMerchant();
Console.WriteLine(qris.BuatKodeQr(75000));
IPembayaran pembayaran = qris;
pembayaran.ProsesPembayaran(75000);Output yang Dihasilkan:
QRIS-75000-MERCHANT77
QRIS: pembayaran Rp75000 terverifikasi.Mari kita bedah baris demi baris:
IPembayaranQris qris = new QrisMerchant();— variabel bertipe kontrak turunan sehingga member tambahanBuatKodeQrdapat dipanggil, dan member induk tetap tersedia pada variabel yang sama.qris.BuatKodeQr(75000)— method mengembalikan kode QR dengan tipe kembalianstringsesuai deklarasi kontrak, dan nilai tersebut tampil pada baris pertama output.IPembayaran pembayaran = qris;— assignment ke tipe induk berjalan tanpa cast karenaQrisMerchanttetap menepatiIPembayaran.pembayaran.ProsesPembayaran(75000)— pemanggilan member induk berjalan seperti biasa melalui variabel induk.
Rantai pewarisan interface juga boleh lebih dari satu tingkat, dan satu interface boleh mewarisi beberapa interface induk sekaligus melalui daftar yang dipisahkan koma. Pola perluasan bertingkat ini juga dipakai oleh interface bawaan .NET, misalnya IList yang mewarisi IEnumerable, agar kemampuan dari tingkat dasar hingga tingkat lanjut tetap terpisah secara rapi.