17. Operatörlerin Aşırı Yüklenmesi

“+” operatörü sayısal ifadelerde toplama işlemi, metinsel ifadelerde ise birleştirme işlemi yapar. Bir sınıftın iki nesnesini “+” operatörüyle işleme sokarsak C# derleyicisi hata verir. Hata vermesinin sebebi ne yapacağını bilmemesidir. Burada operatörün aşırı yüklenmesi konusu devreye girer. Operatörün aşırı yüklenmesi o operatöre farklı bir görev bir anlam daha yüklemek anlamına gelir.

Aşağıdaki örnekte “+” operatörüne Personel  classından oluşturulmuş nesnelerin maaşlarını toplama görevini ,  “%” operatörüne de Personel classından oluşturulmuş nesnelerin maaşlarını kıyaslama görevini veriyoruz.

Operatörleri aşırı yüklerken dikkat edilecek hususlar.

  • public ve static olarak belirlenmelidir.
  • operator anahtar sözlücü ve operatör işareti kullanılmalıdır.
  • karşılaştırma işaretini aşırı yükleyecekseniz zıttını da aşırı yüklemeniz gerekir.

& , | ve ! operatörlerinin aşırı yüklenmesi önceki uygulamar ile aynıdır. Fakat && ve || operatörlerinin aşırı yüklenmesi için bazı ön koşullar gereklidir.

  • & ve | operatörleri aşırı yüklenmiş olmalıdır.
  • True ve False operatörleri aşırı yüklenmiş olmalıdır.
  • & ve | operatörlerinin parametreleri ve geri dönüş tipleri aynı sınıf tipinde olmalıdır.

Bu ön koşullar yerine getirildiği takdirde && ve || operatörleri kendiliğinden aşırı yüklenmiş olur.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
 class Program
 {
     static void Main(string[] args)
     {
         Personel kisi1 = new Personel();
         kisi1.ad = "Cagatay";
         kisi1.soyad = "KIZILTAN";
         kisi1.fakulte = "Mühendislik";
         kisi1.unvan = "Doc.dr";
         kisi1.maas = 5500;

         Personel kisi2 = new Personel(); 
         kisi2.ad = "Hüseyin";
         kisi2.soyad = "KIZILTAN";
         kisi2.fakulte = "Eğitim";
         kisi2.unvan = "Doc.dr";
         kisi2.maas = 3000;

         int toplam = kisi1 +kisi2;

         Console.WriteLine("Maaslari toplami : {0}", toplam);

         string kiyas = kisi1 % kisi2;

         Console.WriteLine(kiyas);

        Console.ReadKey();
      }
 
 }
 class Personel {

      public string ad, soyad, fakulte, unvan;
      public int maas;
    
      // + operatörü için yeni bir anlam belirlenmiştir ; iki adet nesne alır, bunlar operatörün sağ ve sol operantlarıdır ve bunların maaşlarını toplar.
      public static int operator +(Personel p1,Personel p2)
      {
       return p1.maas + p2.maas;
      }
   
      // % operatörü için yeni bir anlam belirlenmiştir ; iki adet nesne alır, bunlar operatörün sağ ve sol operantlarıdır ve bunların maaşlarını kıyaslar.
      public static string operator %(Personel p1, Personel p2) 
      {
        if (p1.maas > p2.maas)
          return "p1 fazla kazaniyor";
       else if (p1.maas < p2.maas)
          return "p2 fazla kazaniyor";
       else
          return "ikisi de eşit kazaniyor";
      }
 
  }
                 
}