Erişim Belirleyiciler
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 31 / 70.
Erişim belirleyicileri, sınıf üyelerinizi kimlerin görebileceğini ve kullanabileceğini kontrol eder. Bunlar, OOP'nin temel ilkelerinden biri olan kapsüllemenin (encapsulation) temelidir. Erişimi kısıtlayarak verilerinizi korur ve kodunuzda net sınırlar oluşturursunuz.
C# dört ana erişim belirleyicisi sağlar:
public class BankAccount
{
public string AccountHolder; // Her yerden erişilebilir
private decimal balance; // Sadece bu sınıf içinden
protected string accountType; // Bu sınıf ve türetilmiş sınıflar
internal int branchCode; // Aynı derleme (assembly) içinde
}public üyeler herhangi bir koddan erişilebilirdir.
private üyelerine yalnızca aynı sınıf içinden erişilebilir - bu en kısıtlayıcı olanıdır ve sınıf üyeleri için varsayılandır.
protected sınıfın kendisinden ve ondan miras alan herhangi bir sınıftan erişime izin verir.
internal, aynı derleme (proje) içindeki koda erişimi kısıtlar.
Herhangi bir değiştirici belirtilmediğinde, sınıf üyeleri varsayılan olarak private olur:
class Example
{
int secret; // varsayılan olarak private
}Doğru erişim düzeyini seçmek, yalnızca gerekli olanı açığa çıkarmakla ilgilidir. private ile başlayın ve görünürlüğü yalnızca net bir nedeniniz olduğunda artırın. Bu, diğer kodların daha sonra değiştirmek isteyebileceğiniz uygulama detaylarına bağımlı olmasını önler.
Görev
KolayErişim belirleyicilerinin (access modifiers) hassas verileri nasıl koruduğunu ve yalnızca gerekli olanı nasıl sunduğunu gösteren güvenli bir kullanıcı profili sistemi oluşturalım. Bilgilerin kimin erişebileceğine bağlı olarak farklı görünürlük seviyelerine sahip olduğu bir sınıf oluşturacaksınız.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
UserProfile.cs:Securityad alanı (namespace) içinde, kullanıcı bilgilerini uygun erişim seviyeleriyle yöneten birUserProfilesınıfı oluşturun. Profil şunlara sahip olmalıdır:- Bir
publicözellikUsername(string) - kullanıcı adını herkes görebilir - Bir
privatealanpassword(string) - buna yalnızca sınıfın kendisi erişebilir - Bir
protectedalanemail(string) - buna sınıf ve ondan türetilen sınıflar erişebilir - Bir
internalalanuserId(int) - aynı derleme (assembly) içinden erişilebilir
"User: {Username}"değerini döndürenGetPublicInfo()adında birpublicmetot ekleyin. Giriş yapılan değerin özel password alanı ile eşleşmesi durumundatrue, aksi takdirdefalsedöndürenValidatePassword(string input)adında başka birpublicmetot ekleyin.- Bir
AdminProfile.cs:Securityad alanı içinde,UserProfilesınıfından miras alan birAdminProfilesınıfı oluşturun. Bu sınıf,protectedüyelerin türetilmiş sınıflarda nasıl erişilebilir hale geldiğini gösterir. Yapıcı metot aynı dört parametreyi kabul etmeli ve bunları temel (base) yapıcıya aktarmalıdır."Admin: {Username}, Email: {email}"değerini döndürenGetAdminInfo()adında birpublicmetot ekleyin - burada korumalıemailalanına erişebildiğinize dikkat edin!Program.cs: Ana dosyanızda, girdi değerlerini kullanarak birUserProfileve birAdminProfileoluşturun. Mevcut genel metotları çağırarak ve dahili alana (internal field) doğrudan erişerek (aynı derlemede olduğunuz için) erişim seviyelerini gösterin. Her kullanıcı türünün hangi bilgileri ifşa edebileceğini gösterin.
Beş girdi alacaksınız:
- Username
- Password
- User ID (tam sayı)
- Doğrulanacak parola denemesi
Çıktıyı şu formatta yazdırın:
Regular User:
{GetPublicInfo() result}
Internal ID: {userId}
Password valid: {ValidatePassword result}
Admin User:
{GetAdminInfo() result}Örneğin, girdiler alice, secret123, alice@email.com, 1001 ve secret123 ise çıktı şöyle olmalıdır:
Regular User:
User: alice
Internal ID: 1001
Password valid: True
Admin User:
Admin: alice, Email: alice@email.comParolanın nasıl tamamen gizli kaldığına dikkat edin - onu asla geri alamazsınız, sadece doğrulayabilirsiniz. E-posta korumalıdır (protected), bu nedenle yalnızca AdminProfile (türetilmiş bir sınıf) onu ifşa edebilir. Dahili userId, aynı derlemede olduğu için ana dosyanızdan erişilebilirdir. İşte bu, kapsülleme (encapsulation) ilkesinin işleyişidir!
Kopya kağıdı
Erişim belirleyiciler, sınıf üyelerinin görünürlüğünü ve erişilebilirliğini kontrol ederek OOP'deki kapsüllemenin (encapsulation) temelini oluşturur.
C# dört ana erişim belirleyici sağlar:
public class BankAccount
{
public string AccountHolder; // Her yerden erişilebilir
private decimal balance; // Sadece bu sınıf içinden
protected string accountType; // Bu sınıf ve türetilmiş sınıflar
internal int branchCode; // Aynı derleme (assembly) içinden
}public: herhangi bir koddan erişilebilir
private: sadece aynı sınıf içinden erişilebilir (en kısıtlayıcı, sınıf üyeleri için varsayılan)
protected: sınıfın kendisinden ve türetilmiş herhangi bir sınıftan erişilebilir
internal: sadece aynı derleme (proje) içinden erişilebilir
Herhangi bir belirleyici belirtilmediğinde, sınıf üyeleri varsayılan olarak private olur:
class Example
{
int secret; // varsayılan olarak private
}En iyi uygulama: private ile başlayın ve dış kodun uygulama detaylarına bağımlı kalmasını önlemek için görünürlüğü yalnızca gerektiğinde artırın.
Kendin dene
using System;
using Security;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string username = Console.ReadLine();
string password = Console.ReadLine();
string email = Console.ReadLine();
int userId = Convert.ToInt32(Console.ReadLine());
string passwordAttempt = Console.ReadLine();
// TODO: Giriş değerleriyle bir UserProfile nesnesi oluşturun
// TODO: Aynı giriş değerleriyle bir AdminProfile nesnesi oluşturun
// TODO: "Regular User:" yazdırın
// TODO: GetPublicInfo() sonucunu yazdırın
// TODO: "Internal ID: " ve ardından userId alanını yazdırın (aynı assembly içinde olduğu için erişilebilir)
// TODO: "Password valid: " ve ardından ValidatePassword() sonucunu yazdırın
// TODO: "Admin User:" yazdırın
// TODO: GetAdminInfo() sonucunu yazdırın
}
}
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ı