Sobes.tech
Junior

Как работает модификатор доступа protected в языках программирования?

sobes.tech AI

Odpowiedź od AI

Modyfikator dostępu protected określa poziom widoczności członków klasy (pól, metod). Dostęp do nich jest ograniczony:

  1. Wewnątrz klasy: Dostęp jest dozwolony. Członkowie protected są widoczni z dowolnego miejsca wewnątrz swojej klasy.
  2. W klasach dziedziczących: Dostęp jest dozwolony. Klasy dziedziczące po klasie z członkami protected mogą bezpośrednio odwoływać się do tych członków, nawet jeśli znajdują się w innym pakiecie (w niektórych językach, np. Java).
  3. W tym samym pakiecie (w niektórych językach, np. Java): Dostęp jest dozwolony, równoważny default (package-private). Członkowie protected są widoczni dla wszystkich klas w tym samym pakiecie, niezależnie od dziedziczenia.
  4. Z zewnątrz (inne pakiety, klasy nie będące dziedziczącymi): Dostęp jest zabroniony. Bezpośredni dostęp do członków protected z klas, które nie dziedziczą lub nie znajdują się w tym samym pakiecie (Java), jest niemożliwy.

Przykład (Java):

class BaseClass {
    protected int protectedMember = 10;

    protected void protectedMethod() {
        // Dostęp z wnętrza klasy jest dozwolony
        System.out.println("Chroniona metoda z BaseClass");
    }
}

class DerivedClass extends BaseClass {
    void accessProtected() {
        // Dostęp z klasy dziedziczącej jest dozwolony
        System.out.println(protectedMember);
        protectedMethod();
    }
}

class SamePackageClass {
    void accessProtected(BaseClass obj) {
        // W Java dostęp z innej klasy w tym samym pakiecie jest dozwolony
        System.out.println(obj.protectedMember);
        obj.protectedMethod();
    }
}

class DifferentPackageClass {
    // ...
    // Próba dostępu będzie błędem kompilacji
    // obj.protectedMember;
    // obj.protectedMethod();
}

W ten sposób protected zapewnia wyższy poziom enkapsulacji niż public, ale niższy niż private lub default, czyniąc członków klasy dostępnymi dla dziedziczących i, w niektórych językach, dla klas w tym samym pakiecie.