Operator + pada int menjumlahkan angka, sedangkan pada string operator yang sama menggabungkan teks. Satu simbol operator punya perilaku berbeda untuk tiap tipe. C# mengizinkan kita mendefinisikan perilaku operator untuk tipe buatan sendiri; mekanisme ini disebut operator overloading. Dengan overloading, expression kasBudi + kasSiti menjadi sah untuk tipe uang buatan kita sendiri, dan kode yang membacanya langsung memahami maksud penjumlahan tersebut.
Tipe Uang dengan struct #
Contoh berikut memakai struct, yaitu tipe nilai yang menampung sekumpulan data di bawah satu nama; perilakunya mirip class dengan semantik nilai. Pada bab ini kita cukup memakai bentuk minimalnya, dan struct dibahas lebih dalam pada bagian tersendiri.
struct Uang
{
public int Jumlah;
public string MataUang;
public Uang(int jumlah, string mataUang)
{
Jumlah = jumlah;
MataUang = mataUang;
}
public static Uang operator +(Uang a, Uang b)
{
return new Uang(a.Jumlah + b.Jumlah, a.MataUang);
}
public static Uang operator -(Uang a, Uang b)
{
return new Uang(a.Jumlah - b.Jumlah, a.MataUang);
}
public override string ToString()
{
return $"Rp{Jumlah}";
}
}
Uang kasBudi = new Uang(50000, "IDR");
Uang kasSiti = new Uang(30000, "IDR");
Uang totalKas = kasBudi + kasSiti;
Console.WriteLine(totalKas);
Console.WriteLine(totalKas.MataUang);
Uang sisa = totalKas - new Uang(25000, "IDR");
Console.WriteLine(sisa);Output yang Dihasilkan:
Rp80000
IDR
Rp55000Mari kita telaah baris demi baris:
- Deklarasi
struct Uang: Tipe ini menampung dua data, yaituJumlahbertipeintdanMataUangbertipestring. - Constructor
Uang(int jumlah, string mataUang): Method khusus yang mengisi kedua data saat nilai baru dibuat dengannew Uang(...). public static Uang operator +(Uang a, Uang b): Definisi overload untuk+. Isinya menjumlahkanJumlahkedua operand, lalu mengembalikanUangbaru denganMataUangyang sama.public static Uang operator -(Uang a, Uang b): Definisi overload untuk-dengan pola yang sama; pengurangan80000 - 25000menghasilkanRp55000pada baris terakhir.ToString()yang dioverride: Method ini mengatur bentuk teks saat nilai dicetak, sehinggaConsole.WriteLine(totalKas)menampilkanRp80000.kasBudi + kasSiti: Compiler menemukan operator+milikUangdan memanggil definisi kita; hasilnyaUangdenganJumlahsebesar80000danMataUangberisiIDR.
Aturan Wajib Overload #
Definisi operator mengikuti beberapa aturan tetap:
- Operator wajib dideklarasikan
public static; operator tidak pernah bekerja pada satu objek secara langsung, melainkan pada operand yang masuk lewat parameter. - Minimal satu parameter harus bertipe sama dengan tipe pemilik operator, yaitu
Uangpada contoh di atas. - Operator perbandingan wajib didefinisikan berpasangan:
==bersama!=, serta<bersama>. ToString()pada contoh bukan overload operator, melainkan override method biasa yang memengaruhi cara nilai dicetak.