Dawno, dawno temu, za siedmioma górami, za siedmioma lasami była sobie klasa.
Część 4. Modyfikatory dostępu
Wróćmy do naszej klasy ołówek.
class Ołówek
{
public Ołówek()
{
Kolor = "niebieski";
OłówekJestNaostrzony = true;
DługośćOłówkaWcm = 12;
}
public Ołówek(string kolorOłówka, int początkowaDługość, bool ołówekJestNaostrzonyNaPoczątku)
{
Kolor = kolorOłówka;
OłówekJestNaostrzony = ołówekJestNaostrzonyNaPoczątku;
DługośćOłówkaWcm = początkowaDługość;
}
public string Kolor;
public bool OłówekJestNaostrzony;
public int DługośćOłówkaWcm;
public void ZłamOłówek()
{
//złamanie ołówka
}
public void NaostrzOłówek(int naostrzOIlośćCentymetrów)
{
DługośćOłówkaWcm = DługośćOłówkaWcm - naostrzOIlośćCentymetrów;
OłówekJestNaostrzony = true;
}
public bool CzyOłówekMożnaJeszczeNaostrzyć()
{
return OłówekJestNaostrzony;
}
}
Mamy w niej zdefiniowane właściwości, konstruktory oraz metody. Mają one ustawiony modyfikator dostępu jako Public. Ale czym jest modyfikator dostępu i po co to komu ? A dlaczego ? A na co to potrzebne ?
Modyfikator dostępu określa kto i w jakich okolicznościach może użyć metod, właściwości i konstruktorów oraz samej klasy … tak tak modyfikator dostępu może być też przypisany do klasy.
Modyfikator dostępu można przyrównać do bramkarza stojącego przed klubem, który pozwoli na wykonanie np. metody CzyOłówekMożnaJeszczeNaostrzyć w określonych okolicznościach.
Wyróżnić możemy modyfikatory dostępu:
- Public
- Protected
- Internal
- Private
Możemy używać następujących kombinacji, aby uzyskać określony poziom szczegółowości:
- Public – dostęp jest nieograniczony. W naszym przykładzie możemy bez problemu wykonać metodę CzyOłówekMożnaJeszczeNaostrzyć i nasz bramkarz pozwoli nam bez problemu.
- Protected – dostęp jest ograniczony. Tutaj nasz bramkarz pozwoli wywołać metodę CzyOłówekMożnaJeszczeNaostrzyć tylko z poziomu naszej klasy lub klasą dziedziczącą (o tym w kolejnym wpisie. Można powiedzieć na chwilę obecną, że dzieciom naszej klasy dla uproszczenia). “Tylko z poziomu naszej klasy”, tzn. że inna metoda w klasie może odwołać się do metody CzyOłówekMożnaJeszczeNaostrzyć, ale z zewnątrz metody nie da się wykonać. Przykład
Nie da się wykonać metody z zewnątrz
- Internal – dostęp jest ograniczony i w tym wypadku nasz bramkarz pozwoli na wykonanie naszej metody tylko w ramach assembly, w którym jest nasza klasa.
- Protected internal – w C# nie może być coś jednocześnie protected i internal, dlatego używając tej kombinacji 2 modyfikatorów dostępu, dostęp będzie nadawany w zależności od sytuacji. Dla klas, które dziedziczą nasza metoda CzyOłówekMożnaJeszczeNaostrzyć będzie zachowywała się jak w przypadku protected. Dla klas niedziedziczących będzie się zachowywała jak w przypadku internal.
- Private – dostęp jest ograniczony tylko wewnątrz klasy co oznacza, że w żaden sposób z zewnątrz nie da się dostać do metod i właściwości oznaczonych tym modyfikatorem dostępu. Jest on przeznaczony dla tych metod i właściwości, które są potrzebne wewnątrz klasy i nie chcemy, żeby ktoś inny mógł z nich korzystać. Można np. wykorzystać go do metod pomocniczych, które robią tylko coś wewnątrz klasy.
- Private protected – zostało wprowadzone stosunkowo niedawno w porównaniu do reszty, bo od wersji C# 7.2. To połączenie sprawia, że do metody lub właściwości w naszej klasie są dostępne tylko w naszej klasie lub klasie dziedziczącej, ale tylko w obrębie jednego assembly.
Nasza klasa Ołówek nie ma nadanego modyfikatora dostępu i wygląda tak
Class Ołówek{
…
}
W tym przypadku, jeżeli nie podamy w jawny sposób modyfikatora dostępu to domyślnie klasa przyjmuje wartość private, czyli widząc
Class Ołówek{
}
możemy to czytać jako
private Class Ołówek{
}
Na koniec jeszcze bardzo fajny obrazek ilustrujący różnicę między modyfikatorami private, protected i public 🙂
Mam nadzieję, że wiesz już czym są modyfikatory dostępu i jaka jest różnica np. pomiędzy public i private.
To be continued …