Menu
Coddy logo textTech

Operatör Aşırı Yükleme

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 36 / 70.

Operatör aşırı yükleme, +, - veya == gibi operatörlerin özel sınıflarınızla nasıl davranacağını tanımlamanıza olanak tanır. point1.Add(point2) gibi metotları çağırmak yerine, daha doğal olan point1 + point2 yazabilirsiniz.

Bir operatörü aşırı yüklemek için operator anahtar kelimesini kullanarak özel bir statik metot oluşturursunuz:

public class Vector
{
    public int X { get; }
    public int Y { get; }
    
    public Vector(int x, int y)
    {
        X = x;
        Y = y;
    }
    
    public static Vector operator +(Vector a, Vector b)
    {
        return new Vector(a.X + b.X, a.Y + b.Y);
    }
}

Artık vektörleri doğal bir şekilde toplayabilirsiniz:

Vector v1 = new Vector(3, 4);
Vector v2 = new Vector(1, 2);
Vector v3 = v1 + v2;  // X = 4, Y = 6

Metot public static olmalıdır ve en az bir parametre içeren tür olmalıdır. Aritmetik operatörleri (+, -, *, /), karşılaştırma operatörlerini (==, !=, <, >) ve birli operatörleri (-, !, ++) aşırı yükleyebilirsiniz.

Karşılaştırma operatörlerinin çiftler halinde aşırı yüklenmesi gerektiğini unutmayın - == tanımlarsanız, != operatörünü de tanımlamanız gerekir.

Operatör aşırı yüklemesini (operator overloading), özellikle vektörler, karmaşık sayılar veya para gibi matematiksel türler için kodunuzu daha sezgisel hale getirdiğinde kullanın. İşlemin anlamı hemen belli olmadığında bundan kaçının.

challenge icon

Görev

Kolay

Operatör aşırı yükleme (operator overloading) yoluyla kesirlerle çalışmayı doğal hale getiren bir Fraction sınıfı oluşturalım. fraction1.Add(fraction2) gibi metotları çağırmak yerine, sezgisel olan fraction1 + fraction2 yazabileceksiniz.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Fraction.cs: Math ad alanı (namespace) içinde, bir pay ve paydayı temsil eden bir Fraction sınıfı oluşturun. Kesriniz şunlara sahip olmalıdır:
    • İki salt okunur tam sayı özelliği: Numerator ve Denominator
    • Pay ve paydayı (bu sırayla) kabul eden bir yapıcı metot (constructor)
    • Şu formülü kullanarak iki kesri toplayan aşırı yüklenmiş bir + operatörü: (a/b) + (c/d) = (a*d + c*b) / (b*d)
    • İki kesri çarpan aşırı yüklenmiş bir * operatörü: (a/b) * (c/d) = (a*c) / (b*d)
    • İki kesrin eşit olup olmadığını döndüren aşırı yüklenmiş bir == operatörü (karşılaştırmak için içler dışlar çarpımı yapın: a*d == c*b)
    • == operatörünü aşırı yüklediğinizde gerekli olan ve == operatörünün zıttını döndüren aşırı yüklenmiş bir != operatörü
    • Kesri "{Numerator}/{Denominator}" formatında bir dize olarak döndüren bir GetDisplay() metodu
  • Program.cs: Ana dosyanızda, girdi değerlerini kullanarak iki kesir oluşturun. Aşırı yüklenmiş operatörleri; onları toplayarak, çarparak ve eşit olup olmadıklarını kontrol ederek gösterin. Operatörlerinizin doğal bir şekilde çalıştığını göstermek için sonuçları yazdırın.

Dört girdi alacaksınız:

  • Birinci kesrin payı (tam sayı)
  • Birinci kesrin paydası (tam sayı)
  • İkinci kesrin payı (tam sayı)
  • İkinci kesrin paydası (tam sayı)

Çıktıyı şu formatta yazdırın:

Fraction 1: {GetDisplay()}
Fraction 2: {GetDisplay()}
Sum: {GetDisplay()}
Product: {GetDisplay()}
Are equal: {True/False}

Örneğin, girdiler 1, 2, 2 ve 4 ise çıktı şöyle olmalıdır:

Fraction 1: 1/2
Fraction 2: 2/4
Sum: 8/8
Product: 2/8
Are equal: True

1/2 ve 2/4'ün 1*4 == 2*2 olduğu için nasıl eşit olarak tanındığına dikkat edin. Toplam ve çarpım sadeleştirme yapılmadan hesaplanır - bu meydan okuma için bu sorun değil. İşin güzelliği, artık tanıdık operatörleri kullanarak kesirlerle ne kadar doğal bir şekilde çalışabildiğinizde!

Kendin dene

using System;
using Math;

class Program
{
    public static void Main(string[] args)
    {
        // İlk kesir için girdiyi oku
        int num1 = Convert.ToInt32(Console.ReadLine());
        int den1 = Convert.ToInt32(Console.ReadLine());
        
        // İkinci kesir için girdiyi oku
        int num2 = Convert.ToInt32(Console.ReadLine());
        int den2 = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Girdi değerlerini kullanarak iki `Fraction` nesnesi oluşturun
        
        // TODO: Kesirleri toplamak için aşırı yüklenmiş + operatörünü kullanın
        
        // TODO: Kesirleri çarpmak için aşırı yüklenmiş * operatörünü kullanın
        
        // TODO: Eşitliği kontrol etmek için aşırı yüklenmiş == operatörünü kullanın
        
        // TODO: Çıktıyı istenen formatta yazdırın:
        // Fraction 1: {GetDisplay()}
        // Fraction 2: {GetDisplay()}
        // Sum: {GetDisplay()}
        // Product: {GetDisplay()}
        // Are equal: {True/False}
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler