C# ile kullanıcı tanımlı tip geliştirmek ve Operator Overloading
Kerem Bekman | Kategori: C#
C# veya .NET Framework çatısı altındaki herhangi bir dilde, kendi kullanım alanınıza özel tipler üretebilir. Size özel tipi operatör işlemlerine uyarlayabilirsiniz.
Bu çalışmamız için Nesne Yönelimli Programlamlarının en temel özelliklerinden olan “Constructor Overloading” özelliğini sık kullanıcaz. Makale öncesine Constructor Overloading için bu adrese göz atmanızı öneririm.
Kendimize özel yapacağımız tip rasyonel sayılar ve kendi işlemlerini destekleyen bir tip olacak.
Yapabileceğimiz işlemleri kısaca özetlersek
ras r1 = new ras("1/2");
// String ile Rasyonel Sayı Oluşturabilelim
ras r2 = new ras(6,8);
// Int ile Rasyonel Sayı Oluşturabilelim
ras r3 = new ras();
// Ve Değer atamadan tanımlayabilelim..
//Değer atama işlemi
r3.pay = 4;
r3.payda = 5;
ras r4 = r1 + r2; // Operator Overloading
r4.topla("1/5"); // String ile özel toplama
r4.topla(1, 2); // İnt ile Özel toplama
r4.sadelestir(); // Sadeleştirme
MessageBox.Show(r4.Goster()); // Rasyonel sayi gösterimi..
Hemen Object sınıfından türemiş “ras” adlı bir sınıf yaratıyoruz..
public class ras
{
public int pay;
public int payda;
public ras()
{
this.pay = 0;
this.payda = 0;
}
}
Şimdi ras r2 = new ras(6,8); satırındaki yapıcı fonksiyonunu yaratıyoruz.
public class ras
{
public int pay;
public int payda;
public ras()
{
this.pay = 0;
this.payda = 0;
}
public ras(int a, int b)
{
this.pay = a;
this.payda = b;
}
}
Hemen ardından String ile rasyonel sayıyı oluşturabilmek için 3. ek yapıcı fonksiyonumuzu kodlayalım.
ras r1 = new ras(“1/2″);
public class ras
{
public int pay;
public int payda;
public ras()
{
this.pay = 0;
this.payda = 0;
}
public ras(int a, int b)
{
this.pay = a;
this.payda = b;
}
public ras(string veri)
{
int orta = veri.IndexOf("/");
// Bölmek için "/" karakterinin indisini alıyoruz.
int uzunluk = veri.Length; //Verinin uzunluğu
string payS = veri.Substring(0, orta);
//Verinin "/" karakterine kadar ki kısmını payS stringine atıyoruz.
string paydaS = veri.Substring(orta + 1, uzunluk - orta - 1);
//Aynı "/" karakterinden bir sonkraki karakterden başlayarak son karaktere kadar ki kısmınıda paydaS eşitliyoruz.
//Ve bulduğumuz değerleri Integer'a çevirip pay ve paydaya atıyoruz.
this.pay = System.Convert.ToInt32(payS);
this.payda = System.Convert.ToInt32(paydaS);
}
}
Sınıfa özel özellikler eklemek için yukarıdaki parçalama işlemini private bir fonksiyon olarak yazıp diğer özelliklerde fonksiyonel olarak parçalayabilirsiniz.
Örnek özellik olarak topla() fonksiyonunu yapıyoruz
public class ras
{
public int pay;
public int payda;
private string payS;
private string paydaS;
private int orta;
private int uzunluk;
public ras()
{
this.pay = 0;
this.payda = 0;
}
public ras(int a, int b)
{
this.pay = a;
this.payda = b;
}
public ras(string veri)
{
orta = veri.IndexOf("/");
// Bölmek için "/" karakterinin indisini alıyoruz.
uzunluk = veri.Length; //Verinin uzunluğu
payS = veri.Substring(0, orta);
//Verinin "/" karakterine kadar ki kısmını payS stringine atıyoruz.
paydaS = veri.Substring(orta + 1, uzunluk - orta - 1);
//Aynı "/" karakterinden bir sonkraki karakterden başlayarak son karaktere kadar ki kısmınıda paydaS eşitliyoruz.
//Ve bulduğumuz değerleri Integer'a çevirip pay ve paydaya atıyoruz.
this.pay = System.Convert.ToInt32(payS);
this.payda = System.Convert.ToInt32(paydaS);
}
public void topla(int a, int b)
{
this.pay = a * this.payda + b * this.pay;
this.payda = b * this.payda
}
}
topla() gibi aklımıza gelebilecek bir çok özellikler ekleyebiliriz..
OPERATOR OVERLOADING
Yaptığımız tipi oparatörlerle beraber kullanmak istersek eğer .NET Framework bize sunduğu “operator” on eki ile yapabiliyoruz..
operator overloading fonksiyonlarının bazı önemli nedenlerden dolayı public ve static olmak zorundadır..
Kullanımı çok basittir.
ras r4 = r1 + r2; için
public static ras operator + (ras r1, ras r2)
{
//İşlemler..
}
“+” operatörüne oparatör overloading işlemi uyguladığımızda aynı zamanda += oparatörünüde uygulanmış oluyor..
ras r4 = r1 + 5; için
public static ras operator + (ras r1, int i)
{
//İşlemler..
}
if(r1 == r2){} için
public static bool operator == (ras r1, ras r2)
{
//İşlemler..
}
Örnek olarak ras tipindeki “+” operatörü için şu şekilde kod yazabiliriz.
public static ras operator +(ras c1, ras c2)
{
return new ras(c1.pay * c2.payda + c1.payda * c2.pay, c1.payda * c2.payda);
}
sadelestir() Goster() > < == operatörleri gibi birçok özellik ekleyip dahada geliştirilebilir..
Türkiyenin en iyi kozmetik sitesi.Uçan balık ile air swimmers çok iyi fırsatlarda.Antakya biberi ile zayıflamak artık çok kolay.Online uçak bileti rezarvasyon artık çok daha kolay.
neden olmasin:)