Bagaimana untuk bekerja dengan operator yang berlebihan di C #

Polimorfisme adalah salah satu prinsip asas OOP (Object Oriented Programming). Kata Polimorfisme berasal dari dua perkataan - "poli" yang bermaksud banyak, dan "morph" yang bermaksud bentuk. Oleh itu, polimorfisme menyiratkan adanya perkara yang sama tetapi dalam bentuk yang berbeza.

Overloading operator adalah contoh polimorfisme statik. Anda boleh memanfaatkan beban operator yang berlebihan atau menambah fungsi kepada pengendali agar dapat bekerja dengan jenis yang ditentukan pengguna dengan cara yang sama seperti anda bekerja dengan jenis data asas.

Apa pengendali dan pengendali apa yang boleh berlebihan?

Dalam ungkapan anda biasanya mempunyai operator dan operan. Pengendali adalah mereka yang bekerja pada operan dan semuanya adalah sebahagian daripada ungkapan. Sebagai contoh, berikut adalah ungkapan yang mengandungi dua operan dan satu operator. Operan adalah X dan Y dan pengendali ialah +.

X + Y

Pengendali dikelaskan sebagai tidak berubah, binari, perbandingan, penugasan, dan lain-lain bergantung kepada tujuan mereka dan jumlah operasi yang akan digunakan oleh pengendali. Walaupun sebilangan besar pengendali boleh berlebihan, sekatan tertentu berlaku. Pada hakikatnya, tidak semua pengendali boleh dibebani secara berlebihan.

Pengendali yang tidak bergerak iaitu, pengendali yang bekerja dengan satu operasi dapat berlebihan. Anda juga boleh membebankan operator binari dan operator perbandingan seperti, ==,! =,, =. Namun, anda tidak boleh membebankan operator =,?, ->, baru, is, sizeof atau typeof. Anda juga tidak boleh membebani operator bersyarat seperti && dan || dengan mudah. Juga, pengendali pengindeksan array [] tidak boleh dibebani secara berlebihan.

Anda boleh mengetahui lebih lanjut mengenai apa yang boleh dimuatkan oleh semua pengendali dari artikel MSDN ini.

Melaksanakan pembebanan operator yang berlebihan di C #

Di bahagian ini kita akan menerangkan bagaimana kita dapat melaksanakan pembebanan 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;

       }

   }

Rujuk senarai kod di atas. Kelas DistanceCalculator mengandungi dua anggota data jenis Int32, iaitu kaki dan inci. Kami sekarang akan menambahkan lebih banyak kaedah ke kelas ini untuk menggambarkan bagaimana pengendali boleh berlebihan.

Semasa bekerjasama dengan operator yang berlebihan, anda perlu ingat perkara tertentu. Pengendali yang berlebihan harus mempunyai kaedah yang sesuai yang ditandai dengan kata kunci operator. Argumen untuk fungsi operator adalah operan dan fungsi operator anda dapat mengembalikan nilai. Fungsi pengendali mestilah statik dan mestilah anggota jenis yang mengandungi.

Coretan kod berikut menggambarkan bagaimana fungsi pengendali biasa. Contoh ini menunjukkan bagaimana pengendali == dan! = Boleh berlebihan.

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 bahawa Nilai adalah harta yang mengembalikan nilai dari segi inci.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Inilah senarai kod 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;

           }

       }

   }

Coretan kod berikut menggambarkan bagaimana anda boleh 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();

       }

Coretan kod berikut menunjukkan bagaimana anda boleh memuatkan operator + untuk menambah 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 sifat berikut ke kelas DistanceCalculator. Coretan kod berikut menunjukkan bagaimana anda dapat menambahkan dua objek jenis DistanceCalculator dan mengembalikan objek yang dihasilkan sebagai jenis yang sama, iaitu, objek yang dikembalikan adalah jenis DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

Inilah caranya anda dapat membuat dua contoh kelas DistanceCalculator dan memanfaatkan fungsi operator yang terlalu banyak untuk memberikan hasilnya pada objek lain dari jenis 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();

       }