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.

csharp
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:

text
Rp80000
IDR
Rp55000

Mari kita telaah baris demi baris:

  1. Deklarasi struct Uang: Tipe ini menampung dua data, yaitu Jumlah bertipe int dan MataUang bertipe string.
  2. Constructor Uang(int jumlah, string mataUang): Method khusus yang mengisi kedua data saat nilai baru dibuat dengan new Uang(...).
  3. public static Uang operator +(Uang a, Uang b): Definisi overload untuk +. Isinya menjumlahkan Jumlah kedua operand, lalu mengembalikan Uang baru dengan MataUang yang sama.
  4. public static Uang operator -(Uang a, Uang b): Definisi overload untuk - dengan pola yang sama; pengurangan 80000 - 25000 menghasilkan Rp55000 pada baris terakhir.
  5. ToString() yang dioverride: Method ini mengatur bentuk teks saat nilai dicetak, sehingga Console.WriteLine(totalKas) menampilkan Rp80000.
  6. kasBudi + kasSiti: Compiler menemukan operator + milik Uang dan memanggil definisi kita; hasilnya Uang dengan Jumlah sebesar 80000 dan MataUang berisi IDR.

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 Uang pada 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.