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 (Properties), C#'ta kapsüllemeyi (encapsulation) uygulamak için kullanılan birincil araçtır. Alanları (fields) doğrudan açığa çıkarmak yerine, onları verilerin nasıl erişildiğini ve değiştirildiğini kontrol eden özelliklerle sarmalarsınız.
Bu desen, erişimcilerinde doğrulama veya mantık içeren genel bir özellik (public property) ile özel bir alanı (private field) 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 (properties) 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 tutulduğu bir sınıf oluşturacaksınız - bu, özelliklerin verileriniz için nasıl bekçi görevi gördüğünü gösterecektir.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Product.cs:Inventoryad alanı (namespace) içinde, özellikler aracılığıyla doğrulama yaparak ürün bilgilerini yöneten birProductsınıfı oluşturun. Ürününüzün şunlara ihtiyacı vardır:- Fiyatın asla
0'ın altına düşmemesini sağlayan, genel birPriceözelliğine sahip özel birpricealanı (decimal) - eğer birisi negatif bir fiyat ayarlamaya çalışırsa, bunun yerine0olarak saklanmalıdır - Değerleri
0ile1000arasında tutan, genel birQuantityözelliğine sahip özel birquantityalanı (int) - 0'ın altındaki değerler 0 olur, 1000'in üzerindeki değerler 1000 olur - Genel bir otomatik uygulanan özellik (auto-implemented property)
Name(string) Price * Quantitydeğerini döndüren, hesaplanmış salt okunur bir özellikTotalValue
- Fiyatın asla
Program.cs: Ana dosyanızda, girdi değerlerini kullanarak birProductoluşturun. Ardından, geçersiz olabilecek ek girdi değerleriyle fiyatı ve miktarı değiştirmeye çalışın. Özelliklerin verileri nasıl koruduğunu görmek için ürünün durumunu oluşturulduktan sonra ve her değişiklikten sonra yazdırın.
Beş girdi alacaksınız:
- Ürün adı
- Başlangıç fiyatı (decimal)
- Başlangıç miktarı (integer)
- Ayarlanacak yeni fiyat (decimal, negatif olabilir)
- Ayarlanacak yeni miktar (integer, aralık dışında olabilir)
Çıktıyı şu formatta yazdırın:
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ı şöyle 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ğuna ve 1500 miktarının nasıl 1000 ile sınırlandırıldığına dikkat edin. Özellikleriniz nesneyi geçersiz durumlardan koruyor - işte bu kapsülleme (encapsulation) iş başında!
Kopya kağıdı
Özellikler, get ve set erişimcileri aracılığıyla kontrollü erişim sağlayarak özel alanları sarmalar; böylece doğrulama ve kapsülleme imkanı sunar:
public class Temperature
{
private double celsius;
public double Celsius
{
get { return celsius; }
set
{
if (value < -273.15)
celsius = -273.15;
else
celsius = value;
}
}
}Özellikler, dahili alanlara dayalı olarak değerler hesaplayabilir:
public double Fahrenheit
{
get { return celsius * 9 / 5 + 32; }
set { celsius = (value - 32) * 5 / 9; }
}Salt okunur özellikler set erişimcisini içermez, bu da yalnızca hesaplanmış veya saklanan değerlerin alınmasına izin verir.
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ı