C# ile kullanıcı tanımlı tip geliştirmek ve Operator Overloading

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

  1. ras r1 = new ras("1/2");
  2. // String ile Rasyonel Sayı Oluşturabilelim
  3.  
  4. ras r2 = new ras(6,8);
  5. // Int ile Rasyonel Sayı Oluşturabilelim
  6.  
  7. ras r3 = new ras();
  8. // Ve Değer atamadan tanımlayabilelim..
  9.  
  10. //Değer atama işlemi
  11. r3.pay = 4;
  12. r3.payda = 5;
  13.  
  14. ras r4 = r1 + r2; // Operator Overloading
  15. r4.topla("1/5"); // String ile özel toplama
  16. r4.topla(1, 2); // İnt ile Özel toplama
  17. r4.sadelestir(); // Sadeleştirme
  18.  
  19. MessageBox.Show(r4.Goster()); // Rasyonel sayi gösterimi..

Hemen Object sınıfından türemiş “ras” adlı bir sınıf yaratıyoruz..

  1. public class ras
  2. {
  3.      public int pay;
  4.      public int payda;
  5.  
  6.      public ras()
  7.      {
  8.           this.pay = 0;
  9.           this.payda = 0;
  10.      }
  11.  
  12. }

Şimdi ras r2 = new ras(6,8); satırındaki yapıcı fonksiyonunu yaratıyoruz.

  1. public class ras
  2. {
  3.      public int pay;
  4.      public int payda;
  5.  
  6.      public ras()
  7.      {
  8.           this.pay = 0;
  9.           this.payda = 0;
  10.      }
  11.      public ras(int a, int b)
  12.      {
  13.           this.pay = a;
  14.           this.payda = b;
  15.      }
  16.  
  17. }

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″);

  1. public class ras
  2. {
  3.      public int pay;
  4.      public int payda;
  5.  
  6.      public ras()
  7.      {
  8.           this.pay = 0;
  9.           this.payda = 0;
  10.      }
  11.      public ras(int a, int b)
  12.      {
  13.           this.pay = a;
  14.           this.payda = b;
  15.      }
  16.      public ras(string veri)
  17.      {
  18.           int orta = veri.IndexOf("/");
  19.           // Bölmek için "/" karakterinin indisini alıyoruz.
  20.  
  21.           int uzunluk = veri.Length; //Verinin uzunluğu
  22.  
  23.           string payS = veri.Substring(0, orta);
  24.           //Verinin "/" karakterine kadar ki kısmını payS stringine atıyoruz.
  25.  
  26.           string paydaS = veri.Substring(orta + 1, uzunluk – orta – 1);
  27.           //Aynı "/" karakterinden bir sonkraki karakterden başlayarak son karaktere kadar ki kısmınıda paydaS eşitliyoruz.
  28.  
  29.           //Ve bulduğumuz değerleri Integer’a çevirip pay ve paydaya atıyoruz.
  30.           this.pay = System.Convert.ToInt32(payS);
  31.           this.payda = System.Convert.ToInt32(paydaS);
  32.      }
  33.  
  34. }

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

  1. public class ras
  2. {
  3.      public int pay;
  4.      public int payda;
  5.      private string payS;
  6.      private string paydaS;
  7.      private int orta;
  8.      private int uzunluk;
  9.  
  10.      public ras()
  11.      {
  12.           this.pay = 0;
  13.           this.payda = 0;
  14.      }
  15.      public ras(int a, int b)
  16.      {
  17.           this.pay = a;
  18.           this.payda = b;
  19.      }
  20.      public ras(string veri)
  21.      {
  22.           orta = veri.IndexOf("/");
  23.           // Bölmek için "/" karakterinin indisini alıyoruz.
  24.  
  25.           uzunluk = veri.Length; //Verinin uzunluğu
  26.  
  27.           payS = veri.Substring(0, orta);
  28.           //Verinin "/" karakterine kadar ki kısmını payS stringine atıyoruz.
  29.  
  30.           paydaS = veri.Substring(orta + 1, uzunluk – orta – 1);
  31.           //Aynı "/" karakterinden bir sonkraki karakterden başlayarak son karaktere kadar ki kısmınıda paydaS eşitliyoruz.
  32.  
  33.           //Ve bulduğumuz değerleri Integer’a çevirip pay ve paydaya atıyoruz.
  34.           this.pay = System.Convert.ToInt32(payS);
  35.           this.payda = System.Convert.ToInt32(paydaS);
  36.      }
  37.      public void topla(int a, int b)
  38.      {
  39.           this.pay = a * this.payda + b * this.pay;
  40.           this.payda = b * this.payda
  41.      }
  42.  
  43. }

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

  1. public static ras operator + (ras r1, ras r2)
  2. {
  3.      //İşlemler..
  4. }

“+” 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

  1. public static ras operator + (ras r1, int i)
  2. {
  3.      //İşlemler..
  4. }

if(r1 == r2){} için

  1. public static bool operator == (ras r1, ras r2)
  2. {
  3.      //İşlemler..
  4. }

Örnek olarak ras tipindeki “+” operatörü için şu şekilde kod yazabiliriz.

  1. public static ras operator +(ras c1, ras c2)
  2. {
  3.     return new ras(c1.pay * c2.payda + c1.payda * c2.pay, c1.payda * c2.payda);
  4. }

sadelestir() Goster() > < == operatörleri gibi birçok özellik ekleyip dahada geliştirilebilir..

Etiketler: , , , ,

Yorum Yazın