Operatörlerin aşırı yüklenmesi yani overloading desem daha fazla kişi anlayacaktır :) + - == gibi operatörlere değişik görevler vererek biçimlendirmek demek aslında. Sınıf kullandığımız zaman sınıflardan oluşturulan nesneler için çok işe yarar. Önce aşırı yüklemenin mantığını anlama açısından, daha çok bilinen metotların aşırı yüklenme (override) olayı ile ilgili çok yapılan ve kullanılan bir örnek yapalım. Metotların aşırı yüklenmesinde bildiğimiz üzere aşırı yüklenecek olan metot ana sınıfta virtual olarak tanımlanmalı, aşırı yüklenecek sınıfta da override olarak tanımlanarak aşırı yüklenebilir. C# ta ToString() metodu virtual olarak tanımlanmıştır o yüzden bu metodu herhangi bir sınıf içerisinde override ederek bize hizmet edecek hale getirebiliriz. Aşağıda örneklerde kullanacağım sınıf bulunuyor.
public class Person
{
public Person(string name, string surname, int age)
{
this.Name = name;
this.Surname = surname;
this.Age = age;
}
public Person()
{ }
private string name;
private string surname;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public string Surname
{
get { return surname; }
set { surname = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
Şimdi bu sınıftan bir nesne oluşturalım.
Person ps1 = new Person("Ahmet", "UZUN", 22);
Nesnenin sınıf içerisinde de tanımlanan üç özelliği vardır. Age, Name ve Surname. Şimdi ps1 nesnesini ToString() metodu ile içerisindeki özellikleri string e çevirip yazmasını istiyoruz. Bu yüzden ps1.ToString() i çağırdık. Çıktı şu şekilde olacaktır. Benim örneğimde 'blogOrnek.Form1+Person' (ProjeAdi.FormAdi+SınıfAdı) Buradaki nesnemiz ToString() metodu için kapalıdır. Biz bunu override ederek Ad + Soyad + Yaş şeklinde yazdırabiliriz. Bunun için tanımlı class içerisine aşağıdaki kodu eklememiz gerekiyor.
public override string ToString()
{
return (this.Name + " " + this.Surname + " " + this.Age);
}
şimdiki çıktımız ise 'Ahmet UZUN 22' olacak. Şimdi çıktının bir anlamı oldu.
Şimdi operatörlerin aşırı yüklenmesine dönelim. Operatörler de aynen yukarıda yaptığım örnek gibi aşırı yüklenerek sınıf tan tanımlı nesneler için anlamı olabilir. Yoksa Person sınıfından tanımlı iki insanı toplarsanız, toplayamazsınız :) hata alırsınız. Bunun için +
operatörüne Person sınıfından tanımlı iki tane nesne geldiği zaman nasıl davranması
gerektiğini söylememiz gerekiyor. Bu tanımlama sınıf içerisinde yapılmalıdır.
+ operatörüne
gelen iki nesnenin yaşlarını toplayarak sonucu bize int olarak döndürmesini
isteyelim. Bu durumda kodumuz aşağıdaki gibi tanımlanmalıdır.
public static int operator +(Person ps1, Person ps2)
{
return ps1.Age + ps2.Age;
}
Operatörleri
aşırı yüklerken örnekte de olduğu gibi static olarak tanımlmak zorundayız.
Ayrıca operator ve daha sonra hangi operatörü aşırı yükleyeceksek onu
belirtmeliyiz.
Küçük bir örnek
daha ve sonra bitiriyorum. Person sınıfından olan iki nesnenin özelliklerinin
aynı olup olmadığını kontrol etmek için == operatörünü aşırı yükleyelim. Bunun
için bir de != operatörünü aşırı yüklememiz gerekiyor.
public static bool operator ==(Person ps1, Person ps2)
{
if (ps1.Name == ps2.Name && ps1.Surname == ps2.Surname && ps1.Age == ps2.Age)
return true;
else
return false;
}
public static bool operator !=(Person ps1, Person ps2)
{
if (ps1.Name != ps2.Name && ps1.Surname != ps2.Surname && ps1.Age != ps2.Age)
return true;
else
return false;
}
Bu yazıyı
yazmamdaki asıl amaç zor olan bir şeyi bildirmek değil de bilmeyenler,
görmeyenler için böyle bir şey de var demekti. O yüzden basitte tutup anlatmaya çalıştım. Kaynak kodu buradan indirebilirsiniz. blogOrnek.rar (32,13 kb)
3 kişi tarafından 5.0 olarak değerlendirildi
- Currently 5/5 Stars.
- 1
- 2
- 3
- 4
- 5