Modifikátory přístupu (access modifiers) jsou klíčovým nástrojem zapouzdření v objektově orientovaném programování. Řídí viditelnost tříd, metod a členských proměnných.
Úrovně
V C# existují čtyři hlavní úrovně přístupu:
publicinternalprotectedprivate
Navíc existují i jejich kombinace (protected internal a private protected), které ale nejsou hojně využívány.
Public
Přístup ke členům je možný odkudkoliv v rámci Solution. Používá se, pokud je potřeba, aby se typ nebo člen stal veřejnou součástí API.
Internal
Přístup k členům je možný odkudkoliv v rámci Projektu. Používá se pro kód, který není vhodné vystavit pro veřejné použití, ale který potřebuje být sdílen uvnitř projektu.
Protected
Přístup k členům je možný odkudkoliv v rámci třídy a jejich potomků. Používá se, pokud je potřeba dovolit přepisování (override) nebo práci s členy ve třídách, které odvozují od základní třídy, ale zároveň skrýt detaily před ostatními.
Private
Jedná se o nejpřísnější úroveň zapouzdření, která členy třídy zpřístupní jen v rámci třídy. Používá se pro vnitřní implementační detaily třídy.
Správná volba modifikátoru přístupu
Modifikátor přístupu je vhodné volit co nejpřísněji (tzn. ideálně vše by mělo začínat na úrovni
private) a postupně dle požadvků zvolňovat až napublic.
Ukázka
public class Person
{
// Public property - dostupná odkudkoliv
public string FirstName { get; set; }
// Internal property - dostupná jen uvnitř stejného sestavení (projektu)
internal string MiddleName { get; set; }
// Protected property - dostupná jen v této třídě a potomcích
protected string LastName { get; set; }
// Private proměnná
private int age;
public Person(string firstName, string middleName, string lastName, int age)
{
FirstName = firstName;
MiddleName = middleName;
LastName = lastName;
this.age = age;
}
// Veřejná metoda, která využívá private člen
public void DisplayAge()
{
Console.WriteLine($"Age: {age}");
}
}
public class Employee : Person
{
public string JobTitle { get; set; }
public Employee(string firstName, string middleName, string lastName, int age, string jobTitle)
: base(firstName, middleName, lastName, age)
{
JobTitle = jobTitle;
}
public void DisplayInfo()
{
Console.WriteLine($"FirstName (public): {FirstName}"); // OK
Console.WriteLine($"MiddleName (internal): {MiddleName}"); // OK (pokud jsme ve stejném projektu)
Console.WriteLine($"LastName (protected): {LastName}"); // OK
// Console.WriteLine(age); // CHYBA: private
Console.WriteLine($"JobTitle (public): {JobTitle}");
}
}
Modifikátory pro třídy
Třída by měla být buďto public nebo internal. Pokud je vnořená do jiné třídy, tak pak může být i private nebo protected.