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#'ta kapsüllemeyi uygulamanın temel aracıdır. Alanları doğrudan açığa çıkarmak yerine, verilere nasıl erişileceğini ve verilerin nasıl değiştirileceğini denetleyen özelliklerle onları sarmalarsınız.
Bu kalıp, erişim belirteçlerinde doğrulama veya mantık içeren bir genel özellik ile özel bir alanı 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 alt sınırı
else
celsius = value;
}
}
}Artık harici kod imkânsız bir sıcaklık değeri ayarlayamaz. Özellik, nesnenizin her zaman geçerli bir durumda kalmasını sağlayan bir denetçi görevi görür. Bu, kapsüllemenin iş başındaki hâlidir: iç veriler korunurken kontrollü bir arayüz üzerinden erişilebilir olmaya devam eder.
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 içeride 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 önemli 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 hiçbir zaman 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 birer bekçi görevi gördüğünü göstereceksin.
Kodunu iki dosyaya ayıracaksın:
Product.cs: Özellikler aracılığıyla doğrulama yaparak ürün bilgilerini yöneten,Inventoryad alanında birProductsınıfı oluştur. Ürünün şunlara sahip olmalı:- Ondalık türünde özel bir
pricealanı ve fiyatın hiçbir zaman0değerinin altına düşmemesini sağlayan herkese açık birPriceözelliği; biri negatif bir fiyat ayarlamaya çalışırsa bunun yerine0olarak saklanmalı - Tam sayı türünde özel bir
quantityalanı ve değerleri0ile1000arasında tutan herkese açık birQuantityözelliği; 0'ın altındaki değerler 0, 1000'in üzerindeki değerler 1000 olmalı - Herkese açık, otomatik olarak uygulanan bir
Nameözelliği (string) Price * Quantitydeğerini döndüren, hesaplanan ve salt okunur birTotalValueözelliği
- Ondalık türünde özel bir
Program.cs: Ana dosyanda, girdi değerlerini kullanarak birProductoluştur. Ardından fiyatı ve miktarı geçersiz olabilecek ek girdi değerleriyle değiştirmeyi dene. Ö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.
Beş girdi alacaksın:
- Ürün adı
- Başlangıç fiyatı (ondalık)
- Başlangıç miktarı (tam sayı)
- Ayarlanacak yeni fiyat (ondalık, negatif olabilir)
- Ayarlanacak yeni miktar (tam sayı, 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ı şö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 0 değerine dönüştüğüne ve 1500 miktarının 1000 ile sınırlandırıldığına dikkat et. Özelliklerin nesneyi geçersiz durumlardan koruyor; kapsülleme işte 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ştur
// TODO: Oluşturulduktan sonra ürünün durumunu yazdır
Console.WriteLine("After creation:");
// Yazdırma biçimi: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
// TODO: Fiyatı ve miktarı yeni değerlerle değiştir
// TODO: Değişikliklerden sonra ürünün durumunu yazdır
Console.WriteLine("After modifications:");
// Yazdırma biçimi: {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