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 = 6Metot 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.
Görev
KolayOperatö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:Mathad alanı (namespace) içinde, bir pay ve paydayı temsil eden birFractionsınıfı oluşturun. Kesriniz şunlara sahip olmalıdır:- İki salt okunur tam sayı özelliği:
NumeratorveDenominator - 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 birGetDisplay()metodu
- İki salt okunur tam sayı özelliği:
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: True1/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}
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları