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 = 6Yö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.
Görev
KolayOperatö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:Fractionad alanında, pay ve paydadan oluşan bir kesri temsil eden birMathsınıfı oluştur. Kesrin şunlara sahip olması gerekir:- Salt okunur iki tamsayı özelliği:
NumeratorveDenominator - 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ş birtrueoperatö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
- Salt okunur iki tamsayı özelliği:
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: True1/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}
}
}
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ıKendi başına pratik yap: Online C# derleyicisi