Saturday, December 24, 2016

Bab 8. Pemrograman C# Belajar Dari Contoh


8. Mengoverload Operator







Dasar Pengoverloadan Operator

Pengoverloadan operator sangat berkaitan erat dengan pengoverloadan metode. Untuk mengoverload sebuah operator digunakan katakunci operator untuk mendefinisikan sebuah metode operator, yang mendefinisikan aksi dari operator terhadap kelasnya.

Ada dua format metode operator: satu untuk operator unary dan satu untuk operator biner. Bentuk umum setiap format ditunjukkan di sini:

// Bentuk umum untuk pengoverloadan operator unary
public static tipe-nilaibalik operator op(tipe-param operand)
{
  // operasi-operasi
}

// Bentuk umum untuk pengoverloadan operator biner
public static tipe-nilaibalik operator op(tipe-param1 operand1, tipe-param2 operand2)
{
  // operasi-operasi
}

Di sini, operator yang Anda overload, seperti + atau /, menggantikan op. tipe-nilaibalik menspesifikasi tipe dari nilai balik yang dihasilkan operasi yang dispesifikasi. Meskipun bisa bertipe sembarang, nilai balik seringkali sama dengan tipe kelas dari operator yang sedang dioverload. Untuk operator unary, operand dilewatkan di dalam operand. Untuk operator biner, kedua operand dilewatkan di dalam operand1 dan operand2. Perhatikan bahwa metode operator harus dideklarasikan public dan static.

Untuk operator unary, operand harus bertipe sama dengan kelas operator yang sedang didefinisikan. Untuk operator biner, sedikitnya salah satu operand harus bertipe sama dengan kelasnya. Jadi, Anda tidak bisa mendefinisikan-ulang + untuk int atau string.

Satu hal penting yang lain: Parameter operator tidak bisa menggunakan pemodifikasi ref atau out.


Mengoverload Operator Biner
Untuk melihat bagaimana pengoverloadan operator bekerja, akan disajikan sebuah contoh yang mengoverload dua operator biner, + dan –. Program berikut menciptakan sebuah kelas, yang bernama TigaD, yang menetapkan koordinat sebuah objek dalam ruang tiga dimensi. Operator + teroverload menambahkan koordinat satu Objek TigaD kepada objek TigaD lainnya. Operator – teroverload mengurangi koordinat satu objek dari objek lainnya.

// Sebuah contoh untuk mengoverload operator.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3-D

  public TigaD() { x = y = z = 0; }

  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Mengoverload operator +.
  public static TigaD operator +(TigaD op1, TigaD op2)
  {
      TigaD hasil = new TigaD();
   
    /* Ini menambahkan koordinat dari dua titik
       dan menghasilkan hasil. */
    hasil.x = op1.x + op2.x; // Penjumlahan integer
    hasil.y = op1.y + op2.y;
    hasil.z = op1.z + op2.z;
    return hasil;
  }

  // Overload binary -.
  public static TigaD operator -(TigaD op1, TigaD op2)
  {
      TigaD hasil = new TigaD();

    /* Perhatikan urutan operand. op1 adalah operand kiri
       dan op2 adalah operand kanan. */
    hasil.x = op1.x - op2.x; // Pengurangan integer
    hasil.y = op1.y - op2.y;
    hasil.z = op1.z - op2.z;
    return hasil;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTigaD {
    static void Main() {
        TigaD a = new TigaD(1, 2, 3);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c;
       
        Console.Write("Berikut adalah a: ");
        a.Tampil();
       
        Console.WriteLine();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
        Console.WriteLine();
      
        c = a + b; // menambahkan a dan b
        Console.Write("Berikut adalah a + b: ");
        c.Tampil();
        Console.WriteLine();
       
        c = a + b + c; // menambahkan a, b, dan c
        Console.Write("Hasil dari a + b + c: ");
        c.Tampil();
        Console.WriteLine();
      
        c = c - a; // mengurangi a
        Console.Write("Hasil dari c - a: ");
        c.Tampil();
        Console.WriteLine();
      
        c = c - b; // mengurangi b
        Console.Write("Hasil dari c - b: ");
        c.Tampil();
        Console.WriteLine();
    }
}

Program ini menghasilkan keluaran:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Berikut adalah a + b: 11, 12, 13

Hasil dari a + b + c: 22, 24, 26

Hasil dari c - a: 21, 22, 23

Hasil dari c - b: 11, 12, 13

Akan didiskusikan program tersebut secara hati-hati, dimulai dengan operator teroverload +. Ketika dua objek bertipe TigaD dioperasikan oleh operator +, magnitudo dari tiap koordinat dijumlahkan, seperti ditunjukkan di dalam operator+(). Perhatikan bahwa metode ini tidak memodifikasi nilai kedua operandnya. Sebuah objek baru bertipe TigaD diciptakan, yang memuat hasil operasi, dan dijadikan nilai balik. Untuk memahami mengapa operasi + tidak mengubah isi dari operandnya, hal karena mengikuti operasi + aritmatika yang diterapkan seperti ini: 10 + 12. Kelauaran dari operasi ini adalah 22, dan baik 10 maupun 12 tidak berubah akibat operasi penjumlahan ini. Meskipun tidak ada aturan yang melarang sebuah operator teroverload untuk mengubah nilai dari operandnya, adalah hal terbaik untuk konsisten dengan makna aslinya (pada kasus ini sesuai dengan makna aritmatika penjumlahan).

Perhatikan bahwa operator+() menghasilkan nilai balik berupa sebuah objek bertipe TigaD. Meskipun metode tersebut bisa saja menghasilkan nilai balik bertipe apa saja yang valid dalam C#, fakta bahwa ia mengembalikan sebuah objek bertipe TigaD membuat ekspresi gabungan, seperti a + b + c, dapat dilakukan. Di sini, a + b menghasilkan nilai balik bertipe TigaD. Nilai ini kemudian ditambahkan kepada c. Jika ekspresi a + b tidak menghasilkan nilai balik bertipe TigaD, maka ekspresi gabungan tersebut tidak bisa dilakukan.
Di sini adalah satu hal penting yang lain: Ketika koordinat dijumlahkan di dalam operator+(), hasil penjumlahan tersebut dilakukan dalam penjumlahan integer. Ini karena koordinat individual x, y, dan z adalah kuantitas integer.

Sekarang, akan didiskusikan mengenai operator(). Operator – bekerja seperti operator + kecuali bahwa pada operator ini urutan parameter menjadi penting. Ingat bahwa penjumlahan bersifat komutatif, sedangkan pengurangan tidak. (Yaitu, A – B tidak sama dengan B – A). Untuk semua operator biner, parameter pertama selalu merupakan operator kiri. Parameter kedua merupakan operator kanan. Ketika mengimplementasikan versi teroverload dari operator tak-kumulatif, Anda harus mengingat operand mana yang merupakan operand kiri dan mana yang operand kanan.


Mengoverload Operator Unary
Operator unary dioverload sama seperti operator biner. Perbedaan utamanya adalah bahwa operator unary hanya mempunyai satu operand. Sebagai contoh, berikut merupakan sebuah metode yang mengoverload operator minus untuk kelas TigaD:

// Mengoverload unary -.
public static TigaD operator -(TigaD op)
{
  TigaD hasil = new TigaD();
  hasil.x = -op.x;
  hasil.y = -op.y;
  hasil.z = -op.z;
 
  return hasil;
}

Di sini, sebuah objek baru diciptakan yang memuat bidang ternegasi dari operand. Objek ini kemudian dijadikan nilai balik. Perhatikan bahwa operand tetap tidak berubah. Hal ini untuk menjadi konsistensi makna dengan operasi minus unary. Sebagai contoh, di dalam sebuah ekspresi seperti ini:

a = -b

a menerima negasi dari b, tetapi b tetap tidak berubah.

Dalam C#, mengoverload ++ dan -- cukup mudah; Anda hanya cukup menjadikan nilai terinkremen atau terdekremen sebagai nilai balik, tetapi Anda tidak perlu mengubah objek pemanggil. Sebagai contoh, berikut adalah metode operator++() untuk kelas TigaD():

// Mengoverload unary ++.
public static TigaD operator ++(TigaD op)
{
  TigaD hasil = new TigaD();

  // Menghasilkan hasil terinkremen.
  hasil.x = op.x + 1;
  hasil.y = op.y + 1;
  hasil.z = op.z + 1;
 
  return hasil;
}
Berikut adalah versi terekspansi atas program sebelumnya yang mendemonstrasikan operator unary – dan ++.

// Pengoverloadan operator lanjut.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // kooerdinat 3-D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Mengoverload biner +.
  public static TigaD operator +(TigaD op1, TigaD op2)
  {
    TigaD hasil = new TigaD();

    /* Ini menjumlahkan koordinat dari dua titik
       dan memberikan nilai balik hasil. */
    hasil.x = op1.x + op2.x;
    hasil.y = op1.y + op2.y;
    hasil.z = op1.z + op2.z;
    return hasil;
  }

  // Mengoverload biner -.
  public static TigaD operator -(TigaD op1, TigaD op2) {
    TigaD hasil = new TigaD();

    /* Perhatikan urutan operand. op1 adalah operand kiri
       dan op2 adalah operand kanan. */
    hasil.x = op1.x - op2.x;
    hasil.y = op1.y - op2.y;
    hasil.z = op1.z - op2.z;
    return hasil;
  }

  // Mengoverload unary -.
  public static TigaD operator -(TigaD op)
  {
    TigaD hasil = new TigaD();
    hasil.x = -op.x;
    hasil.y = -op.y;
    hasil.z = -op.z;
    return hasil;
  }

  // Mengoverload unary ++.
  public static TigaD operator ++(TigaD op)
  {
    TigaD hasil = new TigaD();
   
    // Menghasilkan hasil terinkremen.
    hasil.x = op.x + 1;
    hasil.y = op.y + 1;
    hasil.z = op.z + 1;
    return hasil;
  }

  // Menampilkan koordinar X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTigaD {
  static void Main() {
    TigaD a = new TigaD(1, 2, 3);
    TigaD b = new TigaD(10, 10, 10);
    TigaD c = new TigaD();

    Console.Write("Berikut adalah a: ");
    a.Tampil();

    Console.WriteLine();
    Console.Write("Berikut adalah b: ");
    b.Tampil();

    Console.WriteLine();
    c = a + b; // menjumlahkan a dan b
    Console.Write("Hasil dari a + b: ");
    c.Tampil();

    Console.WriteLine();
    c = a + b + c; // menjumlahkan a, b, dan c
    Console.Write("Hasil dari a + b + c: ");
    c.Tampil();

    Console.WriteLine();
    c = c - a; // mengurangi a
    Console.Write("Hasil dari c - a: ");
    c.Tampil();

    Console.WriteLine();
    c = c - b; // mengurangi b
    Console.Write("Hasil dari c - b: ");
    c.Tampil();
   
    Console.WriteLine();
    c = -a; // Menugaskan -a kepada c
    Console.Write("Hasil dari -a: ");
    c.Tampil();
   
    Console.WriteLine();
    c = a++; // post-inkreman a
    Console.WriteLine("Diberikan c = a++");
    Console.Write("c adalah ");
    c.Tampil();

    Console.Write("a adalah ");
    a.Tampil();

    // Mereset a menjadi 1, 2, 3
    a = new TigaD(1, 2, 3);
    Console.Write("\nMereset a dengan ");
    a.Tampil();

    c = ++a; // pre-inkremen a
    Console.WriteLine("\nDiberikan c = ++a");
    Console.Write("c adalah ");
    c.Tampil();

    Console.Write("a adalah ");
    a.Tampil();
  }
}

Berikut adalah keluaran program:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Hasil dari a + b: 11, 12, 13

Hasil dari a + b + c: 22, 24, 26

Hasil dari c - a: 21, 22, 23

Hasil dari c - b: 11, 12, 13

Hasil dari -a: -1, -2, -3

Diberikan c = a++
c adalah 1, 2, 3
a adalah 2, 3, 4

Mereset a dengan 1, 2, 3

Diberikan c = ++a
c adalah 2, 3, 4
a adalah 2, 3, 4


Menangani Operasi Pada Tipe Built-in C#
Untuk sembarang kelas dan operator, sebuah metode operator sendiri dapat dioverload. Salah satu alasannya adalah mengijinkan operasi antara tipe kelas dan tipe data lain, seperti tipe built-in. Sebagai contoh, sekali perhatikan kelas TigaD. Sampai sejauh ini, Anda telah melihat bagaimana mengoverload + sehingga ia dapat menjumlahkan koordinat satu objek TigaD dengan koordinat objek TigaD lain. Namun, hal itu bukan satu-satunya cara Anda bisa mendefinisikan penjumlahan untuk TigaD. Misalnya, ada gunanya untuk menambah sebuah nilai integer kepada tiap koordinat dari sebuah objek TigaD. Operasi semacam itu dapat dipakai menggeser sumbu. Untuk melakukan operasi semacam itu, Anda perlu mengoverload + untuk kedua kalinya, seperti ditunjukkan di sini:

// Mengoverload biner + untuk TigaD + int.
public static TigaD operator +(TigaD op1, int op2)
{
  TigaD result = new TigaD ();
  hasil.x = op1.x + op2;
  hasil.y = op1.y + op2;
  hasil.z = op1.z + op2;

  return hasil;
}

Perhatikan bahwa parameter kedua bertipe int. Jadi, metode tersebut mengijinkan sebuah nilai integer ditambahkan ke tiap bidang dari objek TigaD. Hal ini dibolehkan karena, seperti dijelaskan sebelumnya, ketika mengoverload operator biner, salah satu operand harus bertipe kelas yang sedang dioverload. Namun, operand yang lain bisa bertipe sembarang.

Berikut adalah sebuah versi TigaD yang mempunyai dua metode + teroverload:

// Mengoverload penjumlahan untuk TigaD + TigaD dan untuk TigaD + int
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD
{
    int x, y, z; // koordinat 3-D

    public TigaD() { x = y = z = 0; }
    public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

    // Mengoverload operator +.
    public static TigaD operator +(TigaD op1, TigaD op2)
    {
        TigaD hasil = new TigaD();

        /* Ini menambahkan koordinat dari dua titik
           dan menghasilkan hasil. */
        hasil.x = op1.x + op2.x; // Penjumlahan integer
        hasil.y = op1.y + op2.y;
        hasil.z = op1.z + op2.z;
        return hasil;
    }

    // Mengoverload biner + untuk objek + int.
    public static TigaD operator +(TigaD op1, int op2)
    {
        TigaD hasil = new TigaD();
        hasil.x = op1.x + op2;
        hasil.y = op1.y + op2;
        hasil.z = op1.z + op2;
        return hasil;
    }

    // Menampilkan koordinat X, Y, Z.
    public void Tampil()
    {
        Console.WriteLine(x + ", " + y + ", " + z);
    }
}

class DemoTigaD
{
    static void Main()
    {
        TigaD a = new TigaD(1, 2, 3);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c = new TigaD();

        Console.Write("Berikut adalah a: ");
        a.Tampil();

        Console.WriteLine();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
        Console.WriteLine();

        c = a + b; // menambahkan TigaD + TigaD
        Console.Write("Berikut adalah a + b: ");
        c.Tampil();
        Console.WriteLine();

        c = b + 10; // TigaD + int
        Console.Write("Hasil dari b + 10: ");
        c.Tampil();
    }
}

Hasil keluaran program ditampilkan di sini:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Berikut adalah a + b: 11, 12, 13

Hasil dari b + 10: 20, 20, 20

Seperti yang ditegaskan oleh keluaran, ketika + diterapkan pada dua objek TigaD, koordinatnya dijumlahkan bersama. Ketika + diterapkan pada sebuah objek TigaD dan sebuah integer, koordinatnya dinaikkan sebesar nilai integer.

Pengoverloadan + yang barus saja ditunjukkan, tentu saja, menambah kapabilitas pada kelas TigaD. Tetapi, pekerjaan sebenarnya belum selesai. Mengapa? karena operator+(TigaD, int) hanya membolehkan statemen semacam ini:

ob1 = ob2 + 10;

tetapi operator itu, sayangnya, tidak mengijinkan statemen seperti ini:

ob1 = 10 + ob2;

Alasannya adalah bahwa argumen integer adalah argumen kedua, yang merupakan operand sisi-kanan, tetapi statemen tersebut menempatkan argumen integer di kiri. Untuk membolehkan kedua format statemen tersebut, Anda perli mengoverload + untuk ketiga kalinya. Versi ini harus mempunyai parameter pertamanya bertipe int dan parameter keduanya bertipe TigaD. Satu versi dari metode operator+() akan menangani TigaD + int, dan versi lainnya akan menangani int + TigaD. Berikut merupakan sebuah versi TigaD yang mengoverload operator + seperti yang dideskripsikan:

// Mengoverload penjumlahan untuk TigaD + TigaD dan untuk TigaD + int
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD
{
    int x, y, z; // koordinat 3-D

    public TigaD() { x = y = z = 0; }
    public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

    // Mengoverload operator +.
    public static TigaD operator +(TigaD op1, TigaD op2)
    {
        TigaD hasil = new TigaD();

        /* Ini menambahkan koordinat dari dua titik
           dan menghasilkan hasil. */
        hasil.x = op1.x + op2.x; // Penjumlahan integer
        hasil.y = op1.y + op2.y;
        hasil.z = op1.z + op2.z;
        return hasil;
    }

    // Mengoverload biner + untuk objek + int.
    public static TigaD operator +(TigaD op1, int op2)
    {
        TigaD hasil = new TigaD();
        hasil.x = op1.x + op2;
        hasil.y = op1.y + op2;
        hasil.z = op1.z + op2;
        return hasil;
    }

    // Mengoverload biner + untuk int + TigaD.
    public static TigaD operator +(int op1, TigaD op2)
    {
        TigaD hasil = new TigaD();
        hasil.x = op2.x + op1;
        hasil.y = op2.y + op1;
        hasil.z = op2.z + op1;
        return hasil;
    }

    // Menampilkan koordinat X, Y, Z.
    public void Tampil()
    {
        Console.WriteLine(x + ", " + y + ", " + z);
    }
}

class DemoTigaD
{
    static void Main()
    {
        TigaD a = new TigaD(1, 2, 3);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c = new TigaD();

        Console.Write("Berikut adalah a: ");
        a.Tampil();

        Console.WriteLine();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
        Console.WriteLine();

        c = a + b; // menambahkan TigaD + TigaD
        Console.Write("Berikut adalah a + b: ");
        c.Tampil();
        Console.WriteLine();

        c = b + 10; // TigaD + int
        Console.Write("Hasil dari b + 10: ");
        c.Tampil();

        c = 15 + b; // int + TigaD
        Console.Write("Hasil dari 15 + b: ");
        c.Tampil();
    }
}

Keluaran program ditunjukkan di sini:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Berikut adalah a + b: 11, 12, 13

Hasil dari b + 10: 20, 20, 20
Hasil dari 15 + b: 25, 25, 25


Mengoverload Operator Relasional
Operator relasional, seperti == atau <, dapat pula dioverload dan prosesnya cukup sederhana. Biasanya, operator relasional teroverload menghasilkan nilai balik true atau false. Hal ini untuk menjaga konsistensi makna dari operator asli.

Berikut adalah versi dari kelas TigaD yang mengoverload operator < dan >. Pada contoh ini, kedua operator membandingkan objek TigaD berdasarkan jaraknya dari titik awal. Suatu objek lebih besar dari objek lain jika jaraknya dari titik awal lebih besar. Suatu objek lebih kecil dari objek lain jika jaraknya dari titik awal lebih kecil. Jika diberikan dua titik, maka implementasi semacam itu dapat dipakai untuk menentukan titik mana yang terletak lebih jauh atau lebih dekat dari titik awal.

// Mengoverload < dan >.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload <.
  public static bool operator <(TigaD op1, TigaD op2)
  {
    if(Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) <
       Math.Sqrt(op2.x * op2.x + op2.y * op2.y + op2.z * op2.z))
      return true;
    else
      return false;
  }

  // Overload >.
  public static bool operator >(TigaD op1, TigaD op2)
  {
    if(Math.Sqrt(op1.x * op1.x + op1.y * op1.y + op1.z * op1.z) >
       Math.Sqrt(op2.x * op2.x + op2.y * op2.y + op2.z * op2.z))
      return true;
    else
      return false;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTigaD {
  static void Main() {
    TigaD a = new TigaD(5, 6, 7);
    TigaD b = new TigaD(10, 10, 10);
    TigaD c = new TigaD(1, 2, 3);
    TigaD d = new TigaD(6, 7, 5);
   
    Console.Write("Berikut adalah a: ");
    a.Tampil();
    Console.Write("Berikut adalah b: ");
    b.Tampil();
    Console.Write("Berikut adalah c: ");
    c.Tampil();
    Console.Write("Berikut adalah d: ");
    d.Tampil();
    Console.WriteLine();

    if (a > c) Console.WriteLine("a > c adalah true");
    if (a < c) Console.WriteLine("a < c adalah true");
    if (a > b) Console.WriteLine("a > b adalah true");
    if (a < b) Console.WriteLine("a < b adalah true");

    if (a > d) Console.WriteLine("a > d adalah true");
    else if (a < d) Console.WriteLine("a < d adalah true");
    else Console.WriteLine("a dan d berjarak sama dari titik awal");
  }
}

Keluaran program ditampilkan di sini:

Berikut adalah a: 5, 6, 7
Berikut adalah b: 10, 10, 10
Berikut adalah c: 1, 2, 3
Berikut adalah d: 6, 7, 5

a > c adalah true
a < b adalah true
a dan d berjarak sama dari titik awal

Ada satu batasan terhadap pengoverloadan operator relasional: Anda harus mengoverloadnya secara berpasangan. Sebagai contoh, jika Anda mengoverload <, maka Anda juga harus mengoverload >, dan sebaliknya. Semua pasangan operator relasional adalah

==
!=
< 
> 
<=
>=

Satu hal penting lainnya: Jika Anda mengoverload == dan !=, maka Anda biasanya harus mengoverride Object.Equals() dan Object.GetHashCode(). Hal ini akan didiskusikan pada Bab 10.


Mengoverload true dan false
Katakunci true dan false dapat pula dipakai sebagai operator unary untuk kepentingan overload. Versi teroverload dari kedua operator ini menentukan kondisi true dan false relatif terhadap kelas yang Anda ciptakan. Begitu true dan false dioverload untuk sebuah kelas, Anda dapat memakai objek dari kelas tersebut untuk mengendalikan statemen if, while, for, dan do-while atau di dalam eksspresi ?.

Operator true dan false harus dioverload berpasangan. Anda tidak bisa hanya mengoverload salah satunya. Keduanya merupakan operator unary dan mempunyai bentuk umum ini:

public static bool operator true(tipe-param operand)
{
  // return true atau false
}

public static bool operator false(tipe-param operand)
{
// return true atau false
}

Perhatikan bahwa setiap operator menghasilkan nilai balik bertipe bool.

Program berikut menunjukkan bagaimana true dan false diimplementasikan untuk kelas TigaD. Masing-masing mengasumsikan baha objek TigaD bernilai true jika sedikitnya satu koordinat bernilai tak-nol. Jika ketiga koordinat bernilai nol, maka objek bernilai false. Operator dekremen juga diimplementasikan untuk ilustrasi.

// Mengoverload true dan false untuk TigaD.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload true.
  public static bool operator true(TigaD op) {
    if((op.x != 0) || (op.y != 0) || (op.z != 0))
      return true; // sedikitnya satu koordinat bernilai tak-nol
    else
      return false;
  }

  // Overload false.
  public static bool operator false(TigaD op) {
    if((op.x == 0) && (op.y == 0) && (op.z == 0))
      return true; // semua koordinat bernilai nol
    else
      return false;
  }

  // Overload unary --.
  public static TigaD operator --(TigaD op)
  {
    TigaD hasil = new TigaD();

    // Menghasilkan hasil terdekremen.
    hasil.x = op.x - 1;
    hasil.y = op.y - 1;
    hasil.z = op.z - 1;
    return hasil;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTrueFalse
{
    static void Main()
    {
        TigaD a = new TigaD(5, 6, 7);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c = new TigaD(0, 0, 0);
       
        Console.Write("Berikut adalah a: ");
        a.Tampil();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
        Console.Write("Berikut adalah c: ");
        c.Tampil();
        Console.WriteLine();

        if (a) Console.WriteLine("a adalah true.");
        else Console.WriteLine("a adalah false.");
        if (b) Console.WriteLine("b adalah true.");
        else Console.WriteLine("b adalah false.");
        if (c) Console.WriteLine("c adalah true.");
        else Console.WriteLine("c adalah false.");

        Console.WriteLine();
        Console.WriteLine("Mengendalikan sebuah loop menggunakan objek TigaD.");
        do
        {
            b.Tampil();
            b--;
        } while (b);
    }
}

Keluaran program ditampilkan di sini:

Berikut adalah a: 5, 6, 7
Berikut adalah b: 10, 10, 10
Berikut adalah c: 0, 0, 0

a adalah true.
b adalah true.
c adalah false.

Mengendalikan sebuah loop menggunakan objek TigaD.
10, 10, 10
9, 9, 9
8, 8, 8
7, 7, 7
6, 6, 6
5, 5, 5
4, 4, 4
3, 3, 3
2, 2, 2
1, 1, 1

Perhatikan bagaimana objek TigaD dipakai untuk mengendalikan statemen if dan loop do-while. Pada kasus statemen if, objek TigaD dievaluasi menggunakan true. Jika hasil dari operasi ini bernilai true, maka tubuh statemeen if akan dieksekusi. Pada kasus loop do-while, setiap iterasi loop mendekremen b. Loop berulang sepanjang hasil evaluasi terhadap b bernilai true. Ketika b memuat semua koordinat nol, hasil evaluasinya bernilai false ketika operator true diterapkan dan loop akan berhenti.


Mengoverload Operator Logikal
Seperti Anda ketahui, C# mendefinisikan beberapa operator logikal berikut: &, |, !, &&, dan ||. Dari semua operator tersebut, hanya &, |, dan ! yang bisa dioverload. Dengan mengikuti beberapa aturan tertentu, keuntungan dari hubung-singkat && dan || masih bisa diperoleh. Setiap situasi ini akan dibahas.


Pendekatan Sederhana Untuk Mengoverload Operator Logikal
Akan dimulai dengan kasus paling sederhana. Jika Anda tidak memanfaatkan operator logikal hubung-singkat, maka Anda bisa mengoverload & dan |, yang masing-masing menghasilkan nilai balik bool. Operator | teroverload akan menghasilkan nilai balik bertipe bool.

Berikut adalah sebuah contoh yang mengoverload operator logikal !, |, dan & untuk objek bertipe TigaD. Seperti sebelumnya, masing-masing mengasumsikan bahwa objek TigaD bernilai true jika sedikitnya satu koordinat bernilai tak-nol. Jika semua koordinat bernilai nol, maka objek bernilai false.

// Cara sederhana untuk mengoverload !, |, dan & untuk TigaD.
using System;

// kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload |.
  public static bool operator |(TigaD op1, TigaD op2)
  {
    if( ((op1.x != 0) || (op1.y != 0) || (op1.z != 0)) |
      ((op2.x != 0) || (op2.y != 0) || (op2.z != 0)) )
      return true;
    else
      return false;
  }

  // Overload &.
  public static bool operator &(TigaD op1, TigaD op2)
  {
    if (((op1.x != 0) && (op1.y != 0) && (op1.z != 0)) &
       ((op2.x != 0) && (op2.y != 0) && (op2.z != 0)))
      return true;
    else
      return false;
  }

  // Overload !.
  public static bool operator !(TigaD op)
  {
    if ((op.x != 0) || (op.y != 0) || (op.z != 0))
      return false;
    else return true;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoOpLogikal
{
    static void Main()
    {
        TigaD a = new TigaD(5, 6, 7);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c = new TigaD(0, 0, 0);
       
        Console.Write("Berikut adalah a: ");
        a.Tampil();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
        Console.Write("Berikut adalah c: ");
        c.Tampil();
        Console.WriteLine();

        if (!a) Console.WriteLine("a bernilai false.");
        if (!b) Console.WriteLine("b bernilai false.");
        if (!c) Console.WriteLine("c bernilai false.");
        Console.WriteLine();

        if (a & b) Console.WriteLine("a & b bernilai true.");
        else Console.WriteLine("a & b bernilai false.");

        if (a & c) Console.WriteLine("a & c bernilai true.");
        else Console.WriteLine("a & c bernilai false.");

        if (a | b) Console.WriteLine("a | b bernilai true.");
        else Console.WriteLine("a | b bernilai false.");

        if (a | c) Console.WriteLine("a | c bernilai true.");
        else Console.WriteLine("a | c bernilai false.");
    }
}

Berikut adalah keluaran program:

Berikut adalah a: 5, 6, 7
Berikut adalah b: 10, 10, 10
Berikut adalah c: 0, 0, 0

c bernilai false.

a & b bernilai true.
a & c bernilai false.
a | b bernilai true.
a | c bernilai true.


Memberdayakan Operator Hubung-Singkat
Untuk memanfaatkan operator hubung-singkat && dan ||, Anda harus mematuhi empat aturan. Pertama, kelas harus mengoverload & dan |. Kedua, tipe nilai balik dari metode & dan | teroverload harus sama dengan tipe kelas yang sedang dioverload. Ketiga, setiap parameter harus berupa referensi yang menunjuk ke sebuh objek kelas yang sedang dioverload. Keempat, operator true dan false juga harus dioverload untuk kelas tersebut. Ketika semua kondisi telah terpenuhi, operator hubung-singkat secara otomatis bisa digunakan.

Program berikut menunjukkan bagaiman mengimplementasikan & dan | untuk kelas TigaD sehingga operator hubung-singkat || dan && dapat dimanfaatkan.

/* Cara lebih baik untuk mengoverload !, |, dan & untuk TigaD.
   Versi ini secara otomatis memanfaatkan operator  && dan ||. */
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload | untuk evaluasi hubung-singkat.
  public static TigaD operator |(TigaD op1, TigaD op2)
  {
    if( ((op1.x != 0) || (op1.y != 0) || (op1.z != 0)) |
        ((op2.x != 0) || (op2.y != 0) || (op2.z != 0)) )
      return new TigaD(1, 1, 1);
    else
      return new TigaD(0, 0, 0);
  }

  // Overload & untuk evaluasi hubung-singkat.
  public static TigaD operator &(TigaD op1, TigaD op2)
  {
    if( ((op1.x != 0) && (op1.y != 0) && (op1.z != 0)) &
        ((op2.x != 0) && (op2.y != 0) && (op2.z != 0)) )
      return new TigaD(1, 1, 1);
    else
      return new TigaD(0, 0, 0);
  }

  // Overload !.
  public static bool operator !(TigaD op)
  {
    if(op) return false;
    else return true;
  }

  // Overload true.
  public static bool operator true(TigaD op) {
    if((op.x != 0) || (op.y != 0) || (op.z != 0))
      return true; // sedikitnya satu koordinat bernilai tak-nol
    else
      return false;
  }

  // Overload false.
  public static bool operator false(TigaD op) {
    if((op.x == 0) && (op.y == 0) && (op.z == 0))
      return true; // semua koordinat bernilai nol
    else
      return false;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoOpLogikal {
  static void Main() {
    TigaD a = new TigaD(5, 6, 7);
    TigaD b = new TigaD(10, 10, 10);
    TigaD c = new TigaD(0, 0, 0);
   
    Console.Write("Here is a: ");
    a.Tampil();

    Console.Write("Here is b: ");
    b.Tampil();

    Console.Write("Here is c: ");
    c.Tampil();
    Console.WriteLine();

    if (a) Console.WriteLine("a bernilai true.");
    if (b) Console.WriteLine("b bernilai true.");
    if (c) Console.WriteLine("c bernilai true.");

    if (!a) Console.WriteLine("a bernilai false.");
    if (!b) Console.WriteLine("b bernilai false.");
    if (!c) Console.WriteLine("c bernilai false.");
   
    Console.WriteLine();
    Console.WriteLine("Menggunakan & dan |");
    if (a & b) Console.WriteLine("a & b bernilai true.");
    else Console.WriteLine("a & b bernilai false.");

    if (a & c) Console.WriteLine("a & c bernilai true.");
    else Console.WriteLine("a & c bernilai false.");

    if (a | b) Console.WriteLine("a | b bernilai true.");
    else Console.WriteLine("a | b bernilai false.");

    if (a | c) Console.WriteLine("a | c bernilai true.");
    else Console.WriteLine("a | c bernilai false.");
    Console.WriteLine();

    // Sekarang, menggunakan operator hubung-singkat.
    Console.WriteLine("Menggunakan op hubung-singkat && dan ||");
    if (a && b) Console.WriteLine("a && b bernilai true.");
    else Console.WriteLine("a && b bernilai false.");

    if (a && c) Console.WriteLine("a && c bernilai true.");
    else Console.WriteLine("a && c bernilai false.");

    if (a || b) Console.WriteLine("a || b bernilai true.");
    else Console.WriteLine("a || b bernilai false.");

    if (a || c) Console.WriteLine("a || c bernilai true.");
    else Console.WriteLine("a || c bernilai false.");
  }
}

Keluaran program adalah sebagai berikut:

Here is a: 5, 6, 7
Here is b: 10, 10, 10
Here is c: 0, 0, 0

a bernilai true.
b bernilai true.
c bernilai false.

Menggunakan & dan |
a & b bernilai true.
a & c bernilai false.
a | b bernilai true.
a | c bernilai true.

Menggunakan op hubung-singkat && dan ||
a && b bernilai true.
a && c bernilai false.
a || b bernilai true.
a || c bernilai true.

Akan didiskusikan secara lebih detil bagaimana & dan | diimplementasikan, yang ditunjukkan di sini:

  // Overload | untuk evaluasi hubung-singkat.
  public static TigaD operator |(TigaD op1, TigaD op2)
  {
    if( ((op1.x != 0) || (op1.y != 0) || (op1.z != 0)) |
        ((op2.x != 0) || (op2.y != 0) || (op2.z != 0)) )
      return new TigaD(1, 1, 1);
    else
      return new TigaD(0, 0, 0);
  }

  // Overload & untuk evaluasi hubung-singkat.
  public static TigaD operator &(TigaD op1, TigaD op2)
  {
    if( ((op1.x != 0) && (op1.y != 0) && (op1.z != 0)) &
        ((op2.x != 0) && (op2.y != 0) && (op2.z != 0)) )
      return new TigaD(1, 1, 1);
    else
      return new TigaD(0, 0, 0);
  }

Perhatikan bahwa keduanya menghasilkan nilai balik sebuah objek bertipe TigaD. Perhatikan bagaimana objek ini dibangkitkan. Jika keluaran operasi bernilai true, maka sebuah objek TigaD true (objek dimana sedikitnya satu koordinat bernilai tak-nol) diciptakan dan dijadikan nilai balik. Jika keluaran bernilai false, maka sebuah objek false diciptakan dan dijadikan nilai balik. Jadi, statemen semacam ini

if(a & b) Console.WriteLine("a & b bernilai true.");
else Console.WriteLine("a & b bernilai false.");

Keluaran dari a & b adalah sebuah objek TigaD, yang pada kasus ini merupakan objek true. Karena operator true dan false didefinisikan, pada objek yang dihasilkan ini diterapkan operator true dan hasil bertipe bool dijadikan nilai balik. Pada kasus ini, hasilnya adalah true dan tubuh if dieksekusi.

Karena semua aturan yang diperlukan telah dipatuhi, kedua operator hubung-singkat sekarang bisa digunakan pada objek TigaD. Operand pertama diuji menggunakan operator true (untuk ||) atau operator false (untuk &&). Jika keluaran operasi dapat ditentukan, maka operasi & atau | terkait tidak perlu dievaluasi. Sebaliknya, operator & atau | teroverload akan dipakai untuk menentukan hasil. Jadi, penggunaan && atau || menyebabkan operator & atau | terkait hanya dipanggil ketika operand pertama tidak dapat menentukan keluaran ekspresi. Sebagai contoh, perhatikan statemen ini dari program:

if(a || c) Console.WriteLine("a || c bernilai true.");

Operator true pertama-tama diterapkan terhadap a. Karena a bernilai true pada kasus ini, tidak ada kebutuhan untuk menggunakan operator |. Namun, jika statemen ditulis-ulang menjadi seperti ini:

if(c || a) Console.WriteLine("c || a bernilai true.");

maka operator true pertama-tama diterapkan terhadap c, yang pada kasus ini bernilai false. Jadi, metode operator | akan dipanggil untuk menentukan apakah a bernilai true.


Operator Konversi
Pada beberapa situasi, Anda bisa saja ingin menggunakan objek sebuah kelas di dalam suatu ekspresi yang melibatkan tipe data lain. Kadangkala, pengoverloadan satu atau lebih operator dapat menyediakan cara menyelesaikan masalah ini. Namun, pada beberapa kasus lain, apa yang Anda inginkan hanyalah konversi tipe sederhana dari tipe kelas menjadi tipe target. Untuk menangani kasus tersebut, C# mengijinkan Anda untuk menciptakan sebuah tipe spesial dari metode operator yang dinamakan operator konversi. Operator konversi mengkonversi objek dari kelas Anda menjadi tipe lain.

Ada dua bentuk operator konversi, yaitu implisit dan eksplisit. Bentuk umum masing-masing adalah:

public static operator implicit tipe-target(tipe-sumber v) { return nilai; }
public static operator explicit tipe-target(tipe-sumber v) { return nilai; }

Di sini, tipe-target merupakan tipe target yang menjadi target dari konversi; tipe-sumber adalah tipe awal yang akan dikonversi; dan nilai adalah nilai dari kelas setelah konversi. Operator konversi menghasilkan nilai balik bertipe tipe-target.

Jika operator konversi menspesifikasi implicit, maka konversi dipanggil secara otomatis, seperti ketika sebuah objek digunakan di dalam ekspresi dengan tipe target. Ketika operator konversi menspesifikasi explicit, maka konversi dipanggil ketikan dilakukan sebuah cast. Anda tidak bisa mendefinisikan kedua operator konversi implisit dan eksplisit untuk tipe sumber dan tipe target yang sama.

Untuk mengilustrasikan operator konversi, akan diciptakan satu operator konversi untuk kelas TigaD. Diasumsikan bahwa Anda ingin mengkonversi objek bertipe TigaD menjadi sebuah integer sehingga dapat dipakai di dalam suatu ekspresi integer. Di samping itu, konversi akan terjadi dengan menggunakan hasil perkalian dari ketiga dimensi. Untuk melakukannya, Anda akan menggunakan operator konversi implisit seperti ini:

public static implicit operator int(ThreeD op1)
{
  return op1.x * op1.y * op1.z;
}

Berikut adalah sebuah program yang mengilustrasikan operator konversi ini:

// Sebuah contoh yang menggunakan operator konversi implisit.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload binary +.
  public static TigaD operator +(TigaD op1, TigaD op2)
  {
    TigaD hasil = new TigaD();
    hasil.x = op1.x + op2.x;
    hasil.y = op1.y + op2.y;
    hasil.z = op1.z + op2.z;
    return hasil;
  }

  // Sebuah konversi implisit dari TigaD menjadi int.
  public static implicit operator int(TigaD op1)
  {
    return op1.x * op1.y * op1.z;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTigaD {
  static void Main() {
    TigaD a = new TigaD(1, 2, 3);
    TigaD b = new TigaD(10, 10, 10);
    TigaD c = new TigaD();

    int i;
    Console.Write("Berikut adalah a: ");
    a.Tampil();

    Console.WriteLine();
    Console.Write("Berikut adalah b: ");
    b.Tampil();
  
    Console.WriteLine();
    c = a + b; // menjumlahkan a dan b
    Console.Write("Hasil dari a + b: ");
    c.Tampil();

    Console.WriteLine();
    i = a; // mengkonversi ke int
    Console.WriteLine("Hasil dari i = a: " + i);

    Console.WriteLine();
    i = a * 2 - b; // mengkonversi ke int
    Console.WriteLine("Hasil dari a * 2 - b: " + i);
  }
}

Keluaran program ditampilkan di sini:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Hasil dari a + b: 11, 12, 13

Hasil dari i = a: 6

Hasil dari a * 2 - b: -988

Seperti yang diilustrasikan oleh program, ketika sebuah objek TigaD digunakan di dalam suatu ekspresi integer, seperti i = a, maka konversi diterapkan pada objek tersebut. Pada kasus ini, konversi menghasilkan nilai 6, yang merupakan perkalian dari setiap koordinat yang disimpan di dalam a. Namun, ketika sebuah ekspresi tidak memerlukan konversi ke int, operator konversi tidak dipanggil. Itulah mengapa c = a +b tidak memanggil operator int().

Ingat bahwa Anda dapat menciptakan berbagai operator konversi untuk memenuhi kebutuhan Anda. Anda juga bisa mendefinisikan sebuah operator konversi kedua yang mengkonversi TigaD menjadi double. Setiap konversi diterapkan secara otomatis dan secara independen.

Operator konversi implisit diterapkan secara otomatis ketika sebuah konversi diperlukan di dalam suatu ekspresi, ketika melewatkan sebuah objek ke suatu metode, di dalam penugasan, dan juga ketika sebuah cast eksplisit menjadi tipe target digunakan. Atau, Anda dapat menciptakan sebuah operator eksplisit, yang dipanggil hanya ketika sebuah cast eksplisit dipakai. Operator konversi eksplisit tidak dipanggil secara otomatis. Sebagai contoh, berikut adalah program sebelumnya yang ditulis-ulang untuk melakukan konversi eksplisit menjadi int:

// Menggunakan sebuah konversi eksplisit.
using System;

// Sebuah kelas koordinat tiga dimensi.
class TigaD {
  int x, y, z; // koordinat 3D

  public TigaD() { x = y = z = 0; }
  public TigaD(int i, int j, int k) { x = i; y = j; z = k; }

  // Overload binary +.
  public static TigaD operator +(TigaD op1, TigaD op2)
  {
    TigaD hasil = new TigaD();
    hasil.x = op1.x + op2.x;
    hasil.y = op1.y + op2.y;
    hasil.z = op1.z + op2.z;
    return hasil;
  }

  // Ini konversi eksplisit.
  public static explicit operator int(TigaD op1)
  {
    return op1.x * op1.y * op1.z;
  }

  // Menampilkan koordinat X, Y, Z.
  public void Tampil()
  {
    Console.WriteLine(x + ", " + y + ", " + z);
  }
}

class DemoTigaD
{
    static void Main()
    {
        TigaD a = new TigaD(1, 2, 3);
        TigaD b = new TigaD(10, 10, 10);
        TigaD c = new TigaD();
        int i;

        Console.Write("Berikut adalah a: ");
        a.Tampil();
       
        Console.WriteLine();
        Console.Write("Berikut adalah b: ");
        b.Tampil();
       
        Console.WriteLine();
        c = a + b; // menjumlahkan a dan b
        Console.Write("Hasil dari a + b: ");
        c.Tampil();
       
        Console.WriteLine();
        i = (int)a; // secara eksplisit mengkonversi ke int -- cast diperlukan
        Console.WriteLine("Hasil dari i = a: " + i);
       
        Console.WriteLine();
        i = (int)a * 2 - (int)b; // cast diperlukan
        Console.WriteLine("Hasil dari a * 2 - b: " + i);
    }
}

Hasil yang diperoleh adalah:

Berikut adalah a: 1, 2, 3

Berikut adalah b: 10, 10, 10

Hasil dari a + b: 11, 12, 13

Hasil dari i = a: 6

Hasil dari a * 2 - b: -988

Karena operator konversi sekarang dideklarasikan sebagai explicit, konversi menjadi int harus dicast secara eksplisit. Sebagai contoh, pada baris ini:

i = (int) a; // secara eksplisit dikonversi menjadi int -- cast diperlukan

Jika Anda membuang cast (pada kasus ini, (int)), maka program tidak akan bisa dikompilasi.

Contoh Lain: Penciptaan Tipe Data Empat-Bit
Contoh ini akan mengembangkan sebuah tipe integer empat-bit dan mendefinisikan beberapa operasi untuk tipe data tersebut. Seperti yang Anda ketahui, di awal penemuan teknologi komputasi, kuantitas empat-bit umum dijumpai karena merepresentasikan setengah byte. Tipe data ini juga cukup untuk menampung dijit heksadesimal. Karena empat bit sama dengan setengah byte, kuantitas empat-bit dikenal dengan nybble.

Contoh berikut menggunakan kelas Nybble untuk mengimplementasikan tipe data nybble (empat bit). Kelas ini menggunakan sebuah int untuk penyimpanan, tetapi membatasi nilai yang bisa ditampungnya dalam rentang 0 sampai 15 saja. Kelas Nybble mendefinisikan beberapa operator berikut:
·         Penjumlahan sebuah Nybble dengan sebuah Nybble.
·         Penjumlahan sebuah int dengan sebuah Nybble.
·         Penjumlahan sebuah int dengan sebuah Nybble.
·         Kurang dari dan lebih dari.
·         Operator inkremen.
·         Konversi menjadi Nybble dari int.
·         Konversi menjadi int dari Nybble.

Semua operasi ini cukup untuk membuktikan bagaimana sebuah tipe kelas dapat secara utuh diintegrasikan ke dalam sistem tipe C#. Namun, untuk menyempurnakan implementasi Nybble, Anda perlu mendefinisikan semua operator lain. Anda bisa mencoba menambahkannya sendiri.

Kelas Nybble ditunjukkan di sini bersama dengan kelas DemoNybble, yang mendemonstrasikan kegunaanya:

// Menciptakan tipe 4-bit dinamakan dengan Nybble.
using System;

// Sebuah tipe data 4-bit.
class Nybble {
  int nil; // tempat penyimpanan

  public Nybble() { nil = 0; }
  public Nybble(int i) {
    nil = i;
    nil = nil & 0xF; // mendapatkan 4 bit terbawah
  }

  // Overload biner + untuk Nybble + Nybble.
  public static Nybble operator +(Nybble op1, Nybble op2)
  {
    Nybble hasil = new Nybble();
    hasil.nil = op1.nil + op2.nil;
    hasil.nil = hasil.nil & 0xF; // mendapatkan 4-bit terbawah
    return hasil;
  }

  // Overload biner + untuk Nybble + int.
  public static Nybble operator +(Nybble op1, int op2)
  {
    Nybble hasil = new Nybble();
    hasil.nil = op1.nil + op2;
    hasil.nil = hasil.nil & 0xF; // mendapatkan 4-bit terbawah
    return hasil;
  }

  // Overload biner + untuk int + Nybble.
  public static Nybble operator +(int op1, Nybble op2)
  {
    Nybble hasil = new Nybble();
    hasil.nil = op1 + op2.nil;
    hasil.nil = hasil.nil & 0xF; // mendapatkan 4-bit terbawah
    return hasil;
  }

  // Overload ++.
  public static Nybble operator ++(Nybble op)
  {
    Nybble hasil = new Nybble();
    hasil.nil = op.nil + 1;
    hasil.nil = hasil.nil & 0xF; //  mendapatkan 4-bit terbawah
    return hasil;
  }

  // Overload >.
  public static bool operator >(Nybble op1, Nybble op2)
  {
    if(op1.nil > op2.nil) return true;
    else return false;
  }

  // Overload <.
  public static bool operator <(Nybble op1, Nybble op2)
  {
    if(op1.nil < op2.nil) return true;
    else return false;
  }

  // Mengkonversi sebuah Nybble menjadi sebuah int.
  public static implicit operator int (Nybble op)
  {
    return op.nil;
  }

  // Mengkonversi sebuah int menjadi sebuah Nybble.
  public static implicit operator Nybble(int op)
  {
      return new Nybble(op);
  }
}

class DemoNybble {
  static void Main() {
    Nybble a = new Nybble(1);
    Nybble b = new Nybble(10);
    Nybble c = new Nybble();
    int t;

    Console.WriteLine("a: " + (int) a);
    Console.WriteLine("b: " + (int) b);

    // Menggunakan sebuah Nybble di dalam statemen if.
    if(a < b) Console.WriteLine("a kurang dari b\n");

    // Menambahkan dua Nybble.
    c = a + b;
    Console.WriteLine("c setelah c = a + b: " + (int) c);

    // Menambahkan sebuah int dengan sebuah Nybble.
    a += 5;
    Console.WriteLine("a setelah a += 5: " + (int) a);

    Console.WriteLine();

    // Menggunakan sebuah Nybble di dalam sebuah ekspresi int.
    t = a * 2 + 3;
    Console.WriteLine("Hasil dari a * 2 + 3: " + t);

    Console.WriteLine();

    // Ilustrasi penugasan int dan overflow.
    a = 19;
    Console.WriteLine("Hasil dari a = 19: " + (int) a);

    Console.WriteLine();

    // Menggunakan sebuah Nybble untuk mengendalikan loop.
    Console.WriteLine("Mengendalikan loop for dengan sebuah Nybble.");
    for(a = 0; a < 10; a++)
      Console.Write((int) a + " ");

    Console.WriteLine();
  }
}

Keluaran program ditampilkan di sini:

a: 1
b: 10
a kurang dari b

c setelah c = a + b: 11
a setelah a += 5: 6

Hasil dari a * 2 + 3: 15

Hasil dari a = 19: 3

Mengendalikan loop for dengan sebuah Nybble.
0 1 2 3 4 5 6 7 8 9

Meskipun kebanyakan operasi Nybble mudah dimengerti, ada satu poin penting yang perlu diperhatikan: Operator konversi berperan besar dalam mengintegrasikan Nybble ke dalam sistem tipe C#. Karena konversi didefinisikan dari Nybble ke int dan dari int ke Nybble, sebuah objek Nybble dapat dengan bebas dicampur dalam ekspresi aritmatika. Sebagai contoh, perhatikan ekspresi ini dari program:

t = a * 2 + 3;
Di sini, t adalah sebuah int, seperti 2 dan 3, tetapi a adalah sebuah Nybble. Kedua tipe ini kompatibel di dalam ekspresi karena konversi implisit dari Nybble ke int. Pada kasus ini, karena ekspresi bertipe int, a dikonversi menjadi int oleh metode konversinya.

Konversi dari int menjadi Nybble membolehkan sebuah objek Nybble untuk ditugasi suatu nilai int. Sebagai contoh, di dalam  program, statemen

a = 19;

bekerja seperti ini. Operator konversi dari int menjadi Nybble dieksekusi. Ini menyebabkan sebuah objek Nybble baru diciptakan yang memuat 4-bit terbawah dari nilai 19, yang menghasilkan 3 karena 19 mengoverflow rentang sebuah Nybble. Objek tersebut ditugaskan kepada a. Tanpa operator konversi, ekspresi semacam itu tidak akan diijinkan.

Konversi dari Nybble menjadi int juga dipakai oleh loop for. Tanpa konversi ini, tidak dimungkinkan untuk menuliskan loop for dengan cara seperti itu.





No comments:

Post a Comment