Sobes.tech
Junior

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

sobes.tech AI

Risposta dell'AI

Il modificatore di accesso protected determina il livello di visibilità dei membri della classe (campi, metodi). L'accesso a questi è limitato:

  1. All'interno della classe: L'accesso è consentito. I membri protected sono visibili da qualsiasi punto all'interno della loro classe.
  2. Nelle classi derivate: L'accesso è consentito. Le classi che ereditano da una classe con membri protected possono accedere direttamente a questi membri, anche se si trovano in un altro package (in alcuni linguaggi, ad esempio Java).
  3. All'interno di uno stesso package (in alcuni linguaggi, ad esempio Java): L'accesso è consentito, equivalente a default (package-private). I membri protected sono visibili a tutte le classi nello stesso package, indipendentemente dall'ereditarietà.
  4. Da fuori (altri package, classi non ereditate): L'accesso è vietato. Non è possibile accedere direttamente ai membri protected da classi che non ereditano o che non si trovano nello stesso package (Java).

Esempio (Java):

class BaseClass {
    protected int protectedMember = 10;

    protected void protectedMethod() {
        // L'accesso dall'interno della classe è consentito
        System.out.println("Metodo protetto di BaseClass");
    }
}

class DerivedClass extends BaseClass {
    void accessProtected() {
        // L'accesso da una classe derivata è consentito
        System.out.println(protectedMember);
        protectedMethod();
    }
}

class SamePackageClass {
    void accessProtected(BaseClass obj) {
        // In Java, l'accesso da un'altra classe nello stesso package è consentito
        System.out.println(obj.protectedMember);
        obj.protectedMethod();
    }
}

class DifferentPackageClass {
    // ...
    // Il tentativo di accesso darà errore di compilazione
    // obj.protectedMember;
    // obj.protectedMethod();
}

Pertanto, protected garantisce un livello di incapsulamento più elevato rispetto a public, ma più basso rispetto a private o default, rendendo i membri della classe accessibili ai sottoclassi e, in alcuni linguaggi, alle classi nello stesso package.