Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Eriş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: Security ad alanı (namespace) içinde, kullanıcı bilgilerini uygun erişim seviyeleriyle yöneten bir UserProfile sınıfı oluşturun. Profil şunlara sahip olmalıdır:
    • Bir public özellik Username (string) - kullanıcı adını herkes görebilir
    • Bir private alan password (string) - buna yalnızca sınıfın kendisi erişebilir
    • Bir protected alan email (string) - buna sınıf ve ondan türetilen sınıflar erişebilir
    • Bir internal alan userId (int) - aynı derleme (assembly) içinden erişilebilir
    username, password, email ve userId parametrelerini kabul eden bir yapıcı metot (constructor) ekleyin. "User: {Username}" değerini döndüren GetPublicInfo() adında bir public metot ekleyin. Giriş yapılan değerin özel password alanı ile eşleşmesi durumunda true, aksi takdirde false döndüren ValidatePassword(string input) adında başka bir public metot ekleyin.
  • AdminProfile.cs: Security ad alanı içinde, UserProfile sınıfından miras alan bir AdminProfile sı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üren GetAdminInfo() adında bir public metot ekleyin - burada korumalı email alanına erişebildiğinize dikkat edin!
  • Program.cs: Ana dosyanızda, girdi değerlerini kullanarak bir UserProfile ve bir AdminProfile oluş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
  • Email
  • 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.com

Parolanı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
    }
}
quiz iconKendini test et

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