- Katılım
- 2 Ara 2022
- Mesajlar
- 52
-
Öne çıkan konu
- Portal konusu
- #1

Operatörlerin aşırı yüklenmesi nedir?
Birçok programlama dili temel veri türleri (int, double vb.) üzerinde işlem yapmak için çeşitli operatörleri kullanır.
C#:
int sayi1 = 5;
int sayi2 = 6;
int sonuc = sayi1 + sayi2;
Temel veri türleri üzerinde işlem yapmak içi kullanılan operatörler programlama dili tarafından tanımlanmıştır.
Ancak biz bu operatörleri C# dilinde aşağıdaki gibi doğrudan nesneler üzerinde kullanamayız.
C#:
OrnekNesne n1 = new OrnekNesne();
OrnekNesne n2 = new OrnekNesne();
OrnekNesne n3 = n1 + n2;
C# programlama dili için birçok yerde C ve C++ dilinin devamı olarak ifade edilir.
Çünkü birçok özelliğini C ve C++ dilinden almıştır.
C++ dilinden aldığı özelliklerden birisi de operatörlerin aşırı yüklenmesidir.
Ancak operatörlerin aşırı yüklenmesi C++ dilindeki gibi geniş bir kullanımı yoktur (C++ dilinde akımlarda sıklıkla kullanılır).
C# programlama dilinde operatörlerin aşırı yüklenmesi için aşağıdaki metot tanımı kullanılır.
public static <dönüş-değeri> operator <operatör-işareti>(<parametre>) {}
NOT: Operatörlerin aldığı değere göre parametre sayısı değişebilir.
Operatörlerin aşırı yüklenmesi örneği
Operatörlerin aşırı yüklenmesi ile ilgili örnek aşağıda yer almaktadır.
C#:
class Sayi {
private int sayimiz;
public Sayi(int gelenSayi) {
this.sayimiz = gelenSayi;
}
public void Yazdir() {
Console.WriteLine(this.sayimiz);
}
public static Sayi operator +(Sayi a, Sayi b) {
return new Sayi(a.sayimiz + b.sayimiz);
}
}
C#:
Sayi s1 = new Sayi(10);
Sayi s2 = new Sayi(10);
Sayi s3 = s1 + s2;
s3.Yazdir();
Örnekte sadece + veya toplama operatörü aşırı yüklenmiştir.
Aşırı yükleme sonucu döndürülecek nesnenin Sayi türünden olduğuna ve yeni bir nesne döndürdüğüne dikkat edin.
Burada toplama sonucunu int veya başka türden bir değişkene aktarmak istediğimizde dönüş değerini bu türden döndürebiliriz.
Her iki türden döndürmek istediğimizde karışıklık meydana geleceğinden sadece tek tür kabul edilmektedir.
C#:
class Sayi {
private int sayimiz;
public Sayi(int gelenSayi) {
this.sayimiz = gelenSayi;
}
public void Yazdir() {
Console.WriteLine(this.sayimiz);
}
public static int operator +(Sayi a, Sayi b) {
return a.sayimiz + b.sayimiz;
}
}
C#:
Sayi s1 = new Sayi(10);
Sayi s2 = new Sayi(10);
int s3 = s1 + s2;
Console.WriteLine(s3);
Daha sonra double, float veya string türüne çevirmek istediğimizde bu karışıklıktan dolayı olmayacaktır.
Peki toplama işlemini nasıl int türüne aktarabiliriz.
Bunu için C# içerisinde kullanılan bilinçli (explicit) veya bilinçsiz (implicit) tür dönüşümü operatörlerinin aşırı yüklenmesi gerekir.
Bilinçli tür dönüşümü aşağıdaki gibi tanımlanır.
public static explicit operator <dönüştürülecek-tür>(<tür>) {}
Bilinçsiz tür dönüşümü aşağıdaki gibi tanımlanır.
public static implicit operator <dönüştürülecek-tür>(<tür>) {}
NOT: Her iki tür aynı anda tanımlanamaz.
Bir tür bilinçsiz olarak dönüştürüldüğünde ve bilinçsiz tür dönüşümü tanımlanmadığında bilinçli tür dönüşümünü kullanacağından bilinçli (implicit) tür dönüşümünü tanımlamak faydalı olacaktır.
Tür dönüşümü sırasında veri kaybı olacaksa bu durumu açıkça belirtmek için bilinçsiz tür dönüşümü (explicit) kullanmak faydalı olacaktır.
C#:
class Sayi {
private int sayimiz;
public Sayi(int gelenSayi) {
this.sayimiz = gelenSayi;
}
public void Yazdir() {
Console.WriteLine(this.sayimiz);
}
public static Sayi operator +(Sayi a, Sayi b) {
return new Sayi(a.sayimiz + b.sayimiz);
}
public static implicit operator int(Sayi a) {
return a.sayimiz;
}
}
C#:
Sayi s1 = new Sayi(10);
Sayi s2 = new Sayi(10);
int s3 = s1 + s2;
Console.WriteLine(s3);
C#:
Sayi s1 = 1453;
s1.Yazdir();
C#:
public static implicit operator Sayi(int a) {
return new Sayi(a);
}
Benzer şekilde Decimal veri türü de operatörlerin aşırı yüklenmesi özelliğini kullanır.
Operatörlerin aşırı yüklenmesi ile ilgili en güzel örnek System.Numerics kütüphanesinde yer alan BigInteger sınıfıdır.
Bu sınıf int, double ve decimal sayılarından daha büyük sayılar üzerinde işlem yapmak için tasarlanmıştır ve operatörlerin aşırı yüklenmesi özelliğini kullanmaktadır.
.NET ile geliştirme yaparken en çok kullanılan editör olan Visual Studio editörünün View menüsündeki Object Browser seçeneği ile bu sınıflarda yer alan metot imzalarının incelenmesi faydalı olacaktır.