Bagaimana bekerja dengan operator overloading di C #

Polimorfisme merupakan salah satu prinsip dasar OOP (Object Oriented Programming). Kata Polimorfisme berasal dari dua kata - "poli" yang berarti banyak, dan "morf" yang berarti bentuk. Karenanya, polimorfisme menyiratkan adanya hal yang sama tetapi dalam bentuk yang berbeda.

Overloading operator adalah contoh polimorfisme statis. Anda dapat memanfaatkan kelebihan beban operator atau untuk menambahkan fungsionalitas ke operator sehingga dapat bekerja dengan tipe yang ditentukan pengguna sama seperti Anda bekerja dengan tipe data fundamental.

Operator apa dan operator apa yang bisa kelebihan beban?

Dalam ekspresi Anda biasanya memiliki operator dan operan. Operator adalah mereka yang mengerjakan operand dan semuanya adalah bagian dari ekspresi. Sebagai contoh, berikut ini adalah ekspresi yang berisi dua operan dan satu operator. Operannya adalah X dan Y dan operatornya adalah +.

X + Y

Operator diklasifikasikan sebagai uner, biner, perbandingan, penugasan, dll. Tergantung pada tujuannya dan jumlah operan tempat operator akan bekerja. Meskipun sebagian besar operator dapat kelebihan beban, pembatasan tertentu berlaku. Intinya, tidak semua operator bisa overload.

Operator unary yaitu, operator yang bekerja dengan satu operand dapat kelebihan beban. Anda juga dapat membebani operator biner dan operator perbandingan seperti, ==,! =,, =. Namun, Anda tidak dapat membebani operator =,?, ->, new, is, sizeof atau typeof. Anda juga tidak bisa membebani operator bersyarat seperti && dan || dengan mudah. Selain itu, operator pengindeksan larik [] tidak bisa dibebani.

Anda dapat mempelajari lebih lanjut tentang apa yang semua operator dapat kelebihan beban dari artikel MSDN ini.

Menerapkan kelebihan beban operator di C #

Pada bagian ini kita akan mempelajari bagaimana kita dapat mengimplementasikan overloading operator di C #. Pertimbangkan kelas berikut bernama DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Lihat daftar kode di atas. Kelas DistanceCalculator berisi dua anggota data tipe Int32, yaitu feet dan inch. Kami sekarang akan menambahkan lebih banyak metode ke kelas ini untuk menggambarkan bagaimana operator dapat kelebihan beban.

Saat menangani kelebihan beban operator, Anda perlu memperhatikan poin-poin tertentu. Operator yang akan dibebani harus memiliki metode yang sesuai yang ditandai dengan operator kata kunci. Argumen ke fungsi operator adalah operan dan fungsi operator Anda dapat mengembalikan nilai. Fungsi operator harus statis dan harus menjadi anggota dari tipe yang mengandung.

Cuplikan kode berikut mengilustrasikan bagaimana fungsi operator pada umumnya akan terlihat. Contoh ini menunjukkan bagaimana operator == dan! = Dapat kelebihan beban.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

Perhatikan bahwa Nilai adalah properti yang mengembalikan nilai dalam satuan inci.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Berikut daftar kode lengkap kelas DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

Cuplikan kode berikut menggambarkan bagaimana Anda dapat menggunakan kelas DistanceCalculator.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           Console.WriteLine((obj1 == obj2).ToString());

           Console.Read();

       }

Cuplikan kode berikut menunjukkan bagaimana Anda dapat membebani operator + untuk menambahkan dua objek.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

Mari tambahkan dua properti berikut ke kelas DistanceCalculator. Cuplikan kode berikut menunjukkan bagaimana Anda dapat menambahkan dua objek berjenis DistanceCalculator dan mengembalikan objek yang dihasilkan sebagai tipe yang sama, yaitu, objek yang dikembalikan berjenis DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

Berikut cara membuat dua instance kelas DistanceCalculator dan memanfaatkan fungsi operator yang kelebihan beban untuk menetapkan hasilnya ke objek lain dengan tipe yang sama.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

           Console.WriteLine("Feet: "+obj3.Feet.ToString());

           Console.WriteLine("Inch: " + obj3.Inch.ToString());

           Console.Read();

       }