C# nesne tabanlı bir dil (OOP) olduğu için her şey sınıflar üzerinden yürümektedir. Böylelikle kendi sınıflarımızı (class) oluşturarak kendi arasında arasında işlemler yaptırabiliriz. Sınıflarımız kendi içlerinde de aritmetik ve mantıksal işlemler olabilir. Bunu kendi oluşturduğumuz sınıflar içinde uygulayabiliriz. Ben örnek olarak matematikteki kompleks sayıları kullanacağım. İlk önce bir tane sınıf tanımlayalım:

public class KompleksSayi
        {
            public double Gercek;
            public double Sanal;
            public KompleksSayi()
            {
                Gercek = 0;
                Sanal = 0;
            }
            public KompleksSayi(double Gercek, double Sanal)
            {
                this.Gercek = Gercek;
                this.Sanal = Sanal;
            }
        }

Daha sonra 2 tane değişken tanımlayıp toplamlarını ekrana yazdırmayı deneyelim:

        static void Main(string[] args)
        {
            KompleksSayi k1 = new KompleksSayi(1, 2);
            KompleksSayi k2 = new KompleksSayi(3, 4);
            KompleksSayi k3 = k1 + k2;
            Console.WriteLine(k3);
            Console.ReadKey();
        }

Programı derlemeye çalıştığımızda program derlenmeyecek ve aşağıdaki gibi bir hata mesajı alacağız.

KompleksSayi sınıfı için toplama işlemini yapamadığınız söylüyor uygulama bize. Bunun için operatör aşırı yüklemesini kullanabiliriz. Bunun için ilgili söz dizimi (syntax) aşağıdaki gibi olmalıdır.

public static Sinif operator operator_adi (Sinif1 sol, Sinif2 sag)

KompleksSayi sınıfına aşağıdaki gibi bir operatör aşırı yüklemesi yazdığımızda kodumuzu derleyebileceğiz.

            public static KompleksSayi operator +(KompleksSayi sol, KompleksSayi sag)
            {
                KompleksSayi donus = new KompleksSayi();
                donus.Gercek = sol.Gercek + sag.Gercek;
                donus.Sanal = sol.Sanal + sag.Sanal;
                return donus;
            }

Kodu tekrar derleyip ekrana yazdırdığımızda ise aşağıdaki gibi bir çıktı verecektir. Bunu vermesinin sebebi ise kendi oluşturduğumuz sınıfı string bir ifadeye çevirememesinden kaynaklıdır. Bunun içinde bir üzerine yazma (override) metotu yazabiliriz.

            public override string ToString()
            {
                string donus = "";
                if (this.Gercek != 0)
                    donus = $"{this.Gercek}";
                if (this.Sanal != 0)
                    if (Sanal < 0)
                        donus = $"{donus} {this.Sanal}i";
                    else
                        donus = $"{donus} + {this.Sanal}i";

                if (string.IsNullOrEmpty(donus))
                    donus = "0";

                return donus;
            }

Böyle yapıp derleyip çalıştırdığımızda aşağıdaki gibi bir ekran görüntüsü alacağız.

Aşırı yüklemeleri de kendi içerisinde çoğaltabiliriz. Yeni bir tane aşırı yükleme tanımlayıp kodu biraz revize edersek aşağıdaki gibi bir görüntü elde ederiz.

            public static KompleksSayi operator +(KompleksSayi sol, double sag)
            {
                KompleksSayi donus = new KompleksSayi();
                donus.Gercek = sol.Gercek + sag;
                donus.Sanal = sol.Sanal;
                return donus;
            }
        static void Main(string[] args)
        {
            KompleksSayi k1 = new KompleksSayi(1, 2);
            KompleksSayi k2 = new KompleksSayi(3, 4);
            KompleksSayi k3 = k1 + k2;
            Console.WriteLine(k3);
            k3 = k3 + 4;
            Console.WriteLine(k3);
            Console.ReadKey();
        }

Aynı işlemi eşitlik operatörü içinde kullanabiliriz. Fakat == operatörü içinde aynı zamanda != operatörününde tanımlaması gerekecektir.

            public static bool operator ==(KompleksSayi sol, KompleksSayi sag)
            {
                return sol.Gercek == sag.Gercek && sol.Sanal == sag.Sanal;
            }
            public static bool operator !=(KompleksSayi sol, KompleksSayi sag)
            {
                return !(sol == sag);
            }

Kodu aşağıdaki gibi revize ettiğimizde aşağıdaki gibi bir çıktı alacağız.

        static void Main(string[] args)
        {
            KompleksSayi k1 = new KompleksSayi(1, 2);
            KompleksSayi k2 = new KompleksSayi(3, 4);
            KompleksSayi k3 = k1 + k2;
            Console.WriteLine(k3);
            k3 = k3 + 4;
            Console.WriteLine(k3);

            KompleksSayi k4 = new KompleksSayi(8, 6);

            if (k3 == k4)
            {
                Console.WriteLine("İki değişken birbirine eşit");
            }
            Console.ReadKey();
        }

Kodun son hali aşağıdaki gibidir:

       static void Main(string[] args)
        {
            KompleksSayi k1 = new KompleksSayi(1, 2);
            KompleksSayi k2 = new KompleksSayi(3, 4);
            KompleksSayi k3 = k1 + k2;
            Console.WriteLine(k3);
            k3 = k3 + 4;
            Console.WriteLine(k3);

            KompleksSayi k4 = new KompleksSayi(8, 6);

            if (k3 == k4)
            {
                Console.WriteLine("İki değişken birbirine eşit");
            }
            Console.ReadKey();
        }

        public class KompleksSayi
        {
            public double Gercek;
            public double Sanal;
            public KompleksSayi()
            {
                Gercek = 0;
                Sanal = 0;
            }
            public KompleksSayi(double Gercek, double Sanal)
            {
                this.Gercek = Gercek;
                this.Sanal = Sanal;
            }

            public static KompleksSayi operator +(KompleksSayi sol, KompleksSayi sag)
            {
                KompleksSayi donus = new KompleksSayi();
                donus.Gercek = sol.Gercek + sag.Gercek;
                donus.Sanal = sol.Sanal + sag.Sanal;
                return donus;
            }
            public static KompleksSayi operator +(KompleksSayi sol, double sag)
            {
                KompleksSayi donus = new KompleksSayi();
                donus.Gercek = sol.Gercek + sag;
                donus.Sanal = sol.Sanal;
                return donus;
            }
            public override string ToString()
            {
                string donus = "";
                if (this.Gercek != 0)
                    donus = $"{this.Gercek}";
                if (this.Sanal != 0)
                    if (Sanal < 0)
                        donus = $"{donus} {this.Sanal}i";
                    else
                        donus = $"{donus} + {this.Sanal}i";

                if (string.IsNullOrEmpty(donus))
                    donus = "0";

                return donus;
            }
            public static bool operator ==(KompleksSayi sol, KompleksSayi sag)
            {
                return sol.Gercek == sag.Gercek && sol.Sanal == sag.Sanal;
            }
            public static bool operator !=(KompleksSayi sol, KompleksSayi sag)
            {
                return !(sol == sag);
            }
        }

Bu yazıda kendi yazdığımız sınıflar için operatörlerin aşırı yüklemesini anlatmaya çalıştım. Herkese iyi çalışmalar dilerim.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir