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

Yalnızca gerekli olanları açığa çıkarırken erişim değiştiricilerinin hassas verileri nasıl koruduğunu gösteren güvenli bir kullanıcı profili sistemi oluşturalım. Kimlerin erişebilmesi gerektiğine bağlı olarak farklı bilgi parçalarının farklı görünürlük düzeylerine sahip olduğu bir sınıf oluşturacaksın.

Kodunu üç dosyaya ayıracaksın:

  • UserProfile.cs: UserProfile ad alanında, kullanıcı bilgilerini uygun erişim düzeyleriyle yöneten bir Security sınıfı oluştur. Profil şunlara sahip olmalı:
    • Bir public özelliği olan Username (string) - kullanıcı adını herkes görebilir
    • Bir private alanı olan password (string) - buna yalnızca sınıfın kendisi erişebilmelidir
    • Bir protected alanı olan email (string) - sınıf ve alt sınıfları buna erişebilir
    • Bir internal alanı olan userId (int) - aynı assembly içinde erişilebilir
    username, password, email ve userId kabul eden bir yapıcı ekle. public döndüren, GetPublicInfo() adlı bir "User: {Username}" metot ekle. Özel parolayla eşleşiyorsa public, aksi takdirde ValidatePassword(string input) döndüren, true adlı başka bir false metot ekle.
  • AdminProfile.cs: AdminProfile ad alanında, Security sınıfından kalıtım alan bir UserProfile sınıfı oluştur. Bu sınıf, protected üyelerin türetilmiş sınıflarda nasıl erişilebilir hâle geldiğini gösterir. Yapıcı aynı dört parametreyi kabul etmeli ve bunları temel yapıcıya aktarmalıdır. public döndüren, GetAdminInfo() adlı bir "Admin: {Username}, Email: {email}" metot ekle - burada korumalı email alanına erişebildiğine dikkat et!
  • Program.cs: Ana dosyanda, girdi değerlerini kullanarak bir UserProfile ve bir AdminProfile oluştur. Kullanılabilir public metotları çağırarak ve internal alana doğrudan erişerek (aynı assembly içinde olduğun için) erişim düzeylerini göster. Her kullanıcı türünün hangi bilgileri açığa çıkarabildiğini göster.

Beş girdi alacaksın:

  • Kullanıcı adı
  • Parola
  • E-posta
  • Kullanıcı kimliği (tam sayı)
  • Doğrulanacak parola denemesi

Çıktıyı şu biçimde yazdır:

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 tamamen gizli kaldığına dikkat et - yalnızca doğrulayabilirsin, asla geri alamazsın. E-posta korumalıdır; bu nedenle onu yalnızca AdminProfile (türetilmiş bir sınıf) açığa çıkarabilir. internal userId aynı assembly içinde olduğu için ana dosyandan erişilebilir. İşte kapsülleme uygulamada böyle görünür!

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

Kendi başına pratik yap: Online C# derleyicisi