Operatörlerin Aşırı Yüklenmesi (Operator Overloading C#)

27 May

Bu yazımızın konusu geliştiriciler tarafından oluşturulan sınıflar veya yapılar(struct) üzerinde operatörlerin aşırı yüklenmesidir. Operatörlerin aşırı yüklenmesi, bir operatörün bir nesne için bizim istediğimiz şekliyle çalışabilecek hale getirilmesidir diyebiliriz. Örneğin bir (+) operatörü varsayılan olarak iki sayının toplamı bulmak için veya iki ayrı metnin birleştirilmesi için kullanılır. Bazen yazdığımız sınıflara ait nesneler üzerinde operatörleri kullanmak isteriz. Bu durumda sınıfımızda bir takım değişiklikler yapmak zorundayız.

Bir örnek uygulama üzerinden operatörlerin aşırı yüklenmesini incelemeye çalışalım. Örneğimizin senaryosunda aşırı yükleme işlemini uygulamak için Price adında bir sınıf oluşturup bu sınıfa Cost adında bir property ekleyelim. İki farklı Price nesnesi üzerinden (+) gibi operatörleri aşırı yüklemeye çalışalım.

public class Price
{
      public double Cost { get; set; }

      public static double operator +(Price e1, Price e2)
      {
          return e1.Cost + e2.Cost;
      }
}

En basit gösterimi ile Price sınıfında (+) operatörünün aşırı yüklenmiş halini görüyoruz. Bir operatörün aşırı yüklenmesi bir takım kurallar içermektedir. Bunlar:

  • Operatör fonksiyonu static olmalıdır.
  • Operatör fonksiyonu, aşırı yüklenecek operatörün anahtar kelimesini belirtmelidir.
  • Operatör fonksiyonunun parametreleri, işlenecek tiplerdir.
  • Operatör fonksiyonunun geri dönüş türü belirlenmelidir.

Bu sınıf için (+) operatörünün kullanımı, şu şeklide opacaktır.

 Price p1 = new Price { Cost = 40.10 };
 Price p2 = new Price { Cost = 40.10 };

 var sum = p1 + p2; // sum = 80.20

Artık (+) operatörü, Price nesneleri için bir işleve sahip. Bu işlev, Price nesnesinin Cost parametrelerinin toplamını almasıdır.

Eğer aşırı yükleme işlemini yapmasaydık ve (+) operatörünü aynı şekliyle Price nesnesinde kullanmaya çalışsaydık şu şekilde bir hata alacaktık: “Operator ‘+’ cannot be applied to operands of type ‘OperatorOverrideApp.Price’ and ‘OperatorOverrideApp.Price

Price nesnesine int, double, float gibi built-in tipler ile toplamak istersek sadece işlenen argümanlarda şu şeklide bir değişiklik gerçekleştirmek yeterli olacaktır.

public static double operator +(Price e1, double e2)
{
     return e1.Cost + e2;
}

Bu şekilde, kendi sınıflarımızda operatörlerin aşırı yüklenmesi işlemini incelemeye çalıştık. Örnek uygulamaya ait kodlara buradan ulaşabilirsiniz.