Layanan paylater dapat dijalankan dengan dua kebijakan: pelunasan penuh atau dicicil selama tiga bulan. Kebijakan itu dijanjikan oleh dua kontrak berbeda, IPembayaran dan IPembayaranAngsuran, dan keduanya menjanjikan method dengan signature yang sama persis: ProsesPembayaran(int). Satu class yang menepati keduanya tidak bisa menyediakan dua badan method dengan cara biasa. Explicit implementation menyelesaikan benturan ini dengan menyebut nama interface di depan member.
Menyediakan Dua Implementasi untuk Member yang Sama #
public interface IPembayaranAngsuran
{
void ProsesPembayaran(int jumlah);
}
public class Paylater : IPembayaran, IPembayaranAngsuran
{
public int BiayaAdmin => 2500;
void IPembayaran.ProsesPembayaran(int jumlah)
{
Console.WriteLine($"Paylater: pelunasan penuh Rp{jumlah} diproses.");
}
void IPembayaranAngsuran.ProsesPembayaran(int jumlah)
{
int cicilan = jumlah / 3;
Console.WriteLine($"Paylater: cicilan Rp{cicilan} x 3 bulan.");
}
}Penulisan void IPembayaran.ProsesPembayaran disebut explicit implementation karena nama interface ditulis eksplisit di depan member. Benturan seperti ini lazim ketika class berintegrasi dengan pustaka lain; dua pustaka dapat menjanjikan member dengan nama yang sama tetapi maksud yang berbeda, dan tanpa explicit implementation satu badan method harus melayani dua maksud sekaligus. Member seperti ini tidak boleh diberi access modifier sendiri; keanggotaannya mengikuti interface yang disebut. Property BiayaAdmin tidak mengalami benturan, sehingga property itu tetap diisi dengan cara biasa.
Memilih Implementasi lewat Tipe Variabel #
Pemanggil memilih versi yang berjalan dengan memilih tipe variabel:
Paylater paylater = new Paylater();
IPembayaran lunas = paylater;
lunas.ProsesPembayaran(300000);
IPembayaranAngsuran angsuran = paylater;
angsuran.ProsesPembayaran(300000);Output yang Dihasilkan:
Paylater: pelunasan penuh Rp300000 diproses.
Paylater: cicilan Rp100000 x 3 bulan.Mari kita bedah baris demi baris:
IPembayaran lunas = paylater;— compiler mengaitkan variabel ini dengan implementasi milikIPembayaran.lunas.ProsesPembayaran(300000)— kebijakan pelunasan penuh berjalan sesuai versi kontraknya.IPembayaranAngsuran angsuran = paylater;— object yang sama dilihat dari kontrak kedua.angsuran.ProsesPembayaran(300000)— kebijakan cicilan berjalan; compiler memilih implementasi berdasarkan tipe variabel, bukan tipe class object.int cicilan = jumlah / 3;— logika cicilan hanya hidup di implementasiIPembayaranAngsuran, sehingga pemanggil kontrakIPembayarantidak melihat kebijakan tersebut.
error CS1061: 'Paylater' does not contain a definition for 'ProsesPembayaran' and no accessible extension method 'ProsesPembayaran' accepting a first argument of type 'Paylater' could be found (are you missing a using directive or an assembly reference?)Bila satu badan method memang cukup untuk kedua kontrak, tulis satu implementasi public biasa dan kedua interface memakai badan yang sama. Explicit implementation diperlukan hanya ketika kedua kontrak menuntut perilaku berbeda.