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 🙂

http://dotnethints.com/blogs/public-vs-protected-vs-private

Mam nadzieję, że wiesz już czym są modyfikatory dostępu i jaka jest różnica np. pomiędzy public i private. 

To be continued …