'object' Temel Sınıfı
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 23 / 70.
C#'ta, oluşturduğunuz her sınıf otomatik olarak object adındaki özel bir sınıftan türetilir. Bir temel sınıfı açıkça belirtmeseniz bile, sınıfınızın en üst atası yine de object sınıfıdır. Bu, C#'taki her türün ortak bir metot kümesini paylaştığı anlamına gelir.
object sınıfı, kendi sınıflarınızda geçersiz kılabileceğiniz (override) birkaç sanal metot sağlar:
public class Person
{
public string Name { get; set; }
// object sınıfından geçersiz kılma
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}En yaygın geçersiz kılınan üç yöntem; dize temsili için ToString(), nesneleri karşılaştırmak için Equals() ve karma tabanlı koleksiyonlar için GetHashCode() yöntemleridir. Varsayılan olarak, ToString() tür adını döndürür ve Equals() referans eşitliğini kontrol eder.
Her şey object türünden miras aldığı için, herhangi bir türü bir object değişkeninde saklayabilirsiniz:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceBu evrensel temel sınıf, karışık türleri barındıran koleksiyonlar gibi özellikleri mümkün kılan şeydir ve C#'taki her nesnenin ToString() ve GetType() gibi metotlara erişebilmesinin nedenidir.
Görev
Kolayobject temel sınıfından metotları geçersiz kılmanın (overriding), özel türlerinize dize gösterimi ve eşitlik kontrolü için nasıl anlamlı davranışlar kazandırdığını gösteren bir kitap karşılaştırma sistemi oluşturalım.
Kodunuzu düzenlemek için iki dosya oluşturacaksınız:
Book.cs:Libraryad alanı (namespace) içinde birBooksınıfı tanımlayın. KitabınızınTitle(string) veAuthor(string) özelliklerinin yanı sıra her iki değeri de ayarlayan bir yapıcı metodu (constructor) olmalıdır.objectsınıfından miras alınan üç ana metodu geçersiz kılın:ToString()metodu"{Title} by {Author}"döndürmelidirEquals(object obj)metodu, eğer diğer nesne aynıTitleveAuthordeğerlerine sahip birBookisetruedöndürmelidirGetHashCode()metodu, her iki özelliğin karma kodlarını (hash codes) birleştirmelidir
Program.cs: Ana dosyanızda, giriş değerlerini kullanarak iki kitap oluşturun. Her kitabıToString()kullanarak görüntüleyin, ardından eşit olup olmadıklarını kontrol edin ve sonucu yazdırın. Son olarak, birBooknesnesini birobjectdeğişkeninde saklayabileceğinizi veToString()çağrıldığında hala anlamlı bir çıktı alabildiğinizi gösterin.
Dört giriş alacaksınız:
- Birinci kitabın başlığı
- Birinci kitabın yazarı
- İkinci kitabın başlığı
- İkinci kitabın yazarı
Çıktıyı şu formatta yazdırın:
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}Örneğin, girişler 1984, George Orwell, 1984 ve George Orwell ise çıktı şöyle olmalıdır:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George OrwellGirişler 1984, George Orwell, Brave New World ve Aldous Huxley ise çıktı şöyle olmalıdır:
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George OrwellGeçersiz kıldığınız metotların Book nesnelerine nasıl anlamlı davranışlar kazandırdığına dikkat edin - dize olarak güzelce görüntüleniyorlar ve sadece bellek referanslarına göre değil, içeriklerine göre karşılaştırılabiliyorlar!
Kopya kağıdı
C#'ta her sınıf, geçersiz kılınabilen (overridden) birkaç sanal yöntem sağlayan object sınıfından otomatik olarak türetilir:
Geçersiz Kılınacak Yaygın Nesne Yöntemleri
ToString()- Nesnenin dize temsilini döndürür (varsayılan olarak tür adını döndürür)Equals(object obj)- Nesneleri eşitlik için karşılaştırır (varsayılan olarak referans eşitliğini kontrol eder)GetHashCode()- Karma tabanlı koleksiyonlarda kullanılmak üzere bir karma kodu döndürür
Nesne Yöntemlerini Geçersiz Kılma
public class Person
{
public string Name { get; set; }
// Özel dize temsili için ToString'i geçersiz kılın
public override string ToString()
{
return $"Person: {Name}";
}
// İçerik tabanlı karşılaştırma için Equals'ı geçersiz kılın
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
// Karma tabanlı koleksiyonlar için GetHashCode'u geçersiz kılın
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Evrensel Temel Sınıf
Herhangi bir tür bir object değişkeninde saklanabilir:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceBu evrensel kalıtım, karışık türleri tutan koleksiyonlara olanak tanır ve her nesnenin ToString() ve GetType() gibi yöntemlere erişebilmesini sağlar.
Kendin dene
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// İki kitap için girişleri oku
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: Giriş değerlerini kullanarak iki Book nesnesi oluştur
// TODO: ToString() kullanarak Book 1'i yazdır
// Format: "Book 1: {ToString result}"
// TODO: ToString() kullanarak Book 2'yi yazdır
// Format: "Book 2: {ToString result}"
// TODO: Kitapların eşit olup olmadığını kontrol et ve sonucu yazdır
// Format: "Are they equal? {True/False}"
// TODO: İlk kitabı bir object değişkeninde sakla ve yazdır
// Format: "Stored as object: {ToString result}"
}
}
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ı