Kapsülleme için Özellikler
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 32 / 70.
Özellikler, C# dilinde kapsüllemeyi uygulamak için kullanılan temel araçtır. Alanları doğrudan dışarı açmak yerine, verilere nasıl erişileceğini ve verilerin nasıl değiştirileceğini denetleyen özelliklerle onları sararsınız.
Bu desen, erişim belirleyicilerinde doğrulama veya mantık içeren bir ortak özelliği özel bir alanla birleştirir:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15; // Mutlak sıfır minimumu
else
celsius = value;
}
}
}Artık harici kod imkansız bir sıcaklık değeri ayarlayamaz. Bu özellik bir bekçi görevi görerek nesnenizin her zaman geçerli bir durumda kalmasını sağlar. Bu, iş başındaki kapsüllemedir (encapsulation); dahili veriler korunurken kontrollü bir arayüz aracılığıyla hala erişilebilir durumdadır.
Değerleri hesaplamak veya yan etkileri tetiklemek için özellikleri de kullanabilirsiniz:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Dış dünya iki özellik görür, ancak dahili olarak yalnızca bir alan vardır. Özellikler, sınıfınızı kullanan kodu bozmadan uygulama ayrıntılarını değiştirmenize olanak tanır; bu, doğru kapsüllemenin (encapsulation) temel bir avantajıdır.
Görev
KolayVeri bütünlüğünü korumak için özellikleri kullanan bir ürün envanter sistemi oluşturalım. Fiyatların asla negatif olamayacağı ve miktarların her zaman geçerli sınırlar içinde tutulacağı bir sınıf oluşturacaksın; böylece özelliklerin verilerin için nasıl bekçi görevi gördüğünü göstereceksin.
Kodunu iki dosyaya ayıracaksın:
Product.cs:Productad alanında, özellikler aracılığıyla doğrulama kullanarak ürün bilgilerini yöneten birInventorysınıfı oluştur. Ürünün şunlara sahip olması gerekir:- Ondalık türünde özel bir
pricealanı ve fiyatınPrice'ın altına düşmemesini sağlayan herkese açık bir0özelliği — biri negatif bir fiyat ayarlamaya çalışırsa bunun yerine0olarak saklanmalıdır - Tamsayı türünde özel bir
quantityalanı ve değerleriQuantityile0arasında tutan herkese açık bir1000özelliği — 0'ın altındaki değerler 0, 1000'in üzerindeki değerler 1000 olur - Herkese açık, otomatik uygulanan bir
Nameözelliği (string) TotalValuedeğerini döndüren, hesaplanan salt okunur birPrice * Quantityözelliği
- Ondalık türünde özel bir
Program.cs: Ana dosyanda, giriş değerlerini kullanarak birProductoluştur. Ardından, geçersiz olabilecek ek giriş değerleriyle fiyatı ve miktarı değiştirmeyi dene. Özelliklerin verileri nasıl koruduğunu görmek için ürünün durumunu oluşturma sonrasında ve her değişiklikten sonra yazdır.
Beş giriş alacaksın:
- Ürün adı
- Başlangıç fiyatı (ondalık)
- Başlangıç miktarı (tamsayı)
- Ayarlanacak yeni fiyat (ondalık, negatif olabilir)
- Ayarlanacak yeni miktar (tamsayı, aralık dışında olabilir)
Çıktıyı şu biçimde yazdır:
After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}Örneğin, girdiler Laptop, 999.99, 50, -100 ve 1500 ise çıktı şu şekilde olmalıdır:
After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0Negatif fiyatın nasıl 0 olduğunu ve 1500 miktarının 1000 ile sınırlandırıldığını fark et. Özelliklerin nesneyi geçersiz durumlardan koruyor — işte kapsülleme böyle çalışır!
Kendin dene
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string name = Console.ReadLine();
decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
int initialQuantity = Convert.ToInt32(Console.ReadLine());
decimal newPrice = Convert.ToDecimal(Console.ReadLine());
int newQuantity = Convert.ToInt32(Console.ReadLine());
// TODO: Başlangıç değerlerini kullanarak bir Product oluşturun
// TODO: Oluşturulduktan sonra ürün durumunu yazdırın
Console.WriteLine("After creation:");
// Yazdırma formatı: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Fiyatı ve miktarı yeni değerlerle değiştirin
// TODO: Değişikliklerden sonra ürün durumunu yazdırın
Console.WriteLine("After modifications:");
// Yazdırma formatı: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
}
}
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