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 yöntemleri çağırmak yerine, daha doğal olan point1 + point2 ifadesini yazabilirsiniz.

Bir operatörü aşırı yüklemek için operator anahtar sözcüğünü kullanarak özel bir statik yöntem oluşturursun:

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

Yöntem public static olmalı ve en az bir parametre kapsayıcı tür olmalıdır. Aritmetik işleçleri (+, -, *, /), karşılaştırma işleçlerini (==, !=, <, >) ve tekli işleçleri (-, !, ++) aşırı yükleyebilirsiniz.

Karşılaştırma operatörlerinin çiftler halinde overloaded olması gerektiğini unutma - == tanımlarsan, != de tanımlamalısın.

Kodunuzu daha sezgisel hâle getirdiğinde, özellikle vektörler, karmaşık sayılar veya para gibi matematiksel türler için operatör aşırı yüklemesini kullanın. İşlemin anlamı hemen açık olmadığında bundan kaçının.

challenge icon

Görev

Kolay

Operatör aşırı yükleme sayesinde kesirlerle çalışmayı doğal hissettiren bir Fraction sınıfı oluşturalım. fraction1.Add(fraction2) gibi metotları çağırmak yerine, sezgisel olan fraction1 + fraction2 ifadesini yazabileceksin.

Kodunu iki dosya arasında düzenleyeceksin:

  • Fraction.cs: Fraction ad alanında, pay ve paydadan oluşan bir kesri temsil eden bir Math sınıfı oluştur. Kesrin şunlara sahip olması gerekir:
    • Salt okunur iki tamsayı özelliği: Numerator ve Denominator
    • Payı ve paydayı (bu sırayla) kabul eden bir oluşturucu
    • İki kesri şu formülü kullanarak 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 kesir eşitse == döndüren aşırı yüklenmiş bir true operatörü (karşılaştırmak için çapraz çarpma yap: a*d == c*b)
    • != operatörünü aşırı yüklediğinde gerekli olan ve == operatörünün tersini döndüren aşırı yüklenmiş bir == operatörü
    • Kesri GetDisplay() biçiminde bir dize olarak döndüren "{Numerator}/{Denominator}" metodu
  • Program.cs: Ana dosyanda, girdi değerlerini kullanarak iki kesir oluştur. Bunları toplayıp çarparak ve eşit olup olmadıklarını kontrol ederek aşırı yüklenmiş operatörleri göster. Operatörlerinin doğal biçimde çalıştığını göstermek için sonuçları yazdır.

Dört girdi alacaksın:

  • İlk kesrin payı (tamsayı)
  • İlk kesrin paydası (tamsayı)
  • İkinci kesrin payı (tamsayı)
  • İkinci kesrin paydası (tamsayı)

Çıktıyı şu biçimde yazdır:

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 ifadelerinin 1*4 == 2*2 olduğu için eşit kabul edildiğine dikkat et. Toplama ve çarpma sadeleştirme yapılmadan hesaplanır; bu görev için bunun bir sakıncası yok. Artık tanıdık operatörleri kullanarak kesirlerle ne kadar doğal bir şekilde çalışabildiğinde güzellik yatıyor!

Kendin dene

using System;
using Math;

class Program
{
    public static void Main(string[] args)
    {
        // İlk kesir için girişi oku
        int num1 = Convert.ToInt32(Console.ReadLine());
        int den1 = Convert.ToInt32(Console.ReadLine());
        
        // İkinci kesir için girişi oku
        int num2 = Convert.ToInt32(Console.ReadLine());
        int den2 = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Giriş değerlerini kullanarak iki Fraction nesnesi oluştur
        
        // TODO: Kesirleri toplamak için aşırı yüklenmiş + operatörünü kullan
        
        // TODO: Kesirleri çarpmak için aşırı yüklenmiş * operatörünü kullan
        
        // TODO: Eşitliği kontrol etmek için aşırı yüklenmiş == operatörünü kullan
        
        // TODO: Çıktıyı gerekli formatta yazdır:
        // 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

Kendi başına pratik yap: Online C# derleyicisi