2010-06-06 6 views
5

Qual è stata la logica alla base dell'introduzione dello specificatore di accesso protetto in C++. Un esempio sarebbe utile.Motivazioni alla base dell'introduzione dello specificatore di accesso protetto

+1

La logica sembra essere stata "abbiamo bisogno di fare qualcosa per rendere il linguaggio più complicato di quanto dovrebbe essere e più fragile di quanto dovrebbe essere in modo che i consulenti possano addebitare tariffe enormi per lavori cattivi". –

risposta

2

Il livello di accesso protected viene utilizzato quando le classi devono collaborare con i loro eredi.

Ad esempio, immaginare una classe astratta Shape in grado di segnalare la propria area al mondo esterno.

Diverse forme, come triangoli, quadrati e cerchi, sono descritte in modo diverso (angolo, lato, raggio) e calcolano le loro aree in modo diverso.

La classe Shape potrebbe avere un metodo pubblico getArea() che restituisce una variabile privata che contiene l'area.
Il modo migliore per impostare questa variabile sarebbe un metodo protected chiamato setArea(double) che verrebbe chiamato dalle classi figlie.

Così, Circle chiamerebbe setArea(PI * radius * radius), Square chiamerebbe setArea(side * side), ecc

Si noti che questo non è necessariamente un buon progetto (ma è un grande esempio di protected)

+1

Il modo migliore sarebbe probabilmente utilizzare un metodo virtuale 'getArea'. –

+0

@Matthieu: Sì, ma ciò significherebbe ricalcolare l'area ogni volta che viene chiamata. – SLaks

+2

Non necessariamente, dipende dalla forma derivata per decidere se vale la pena memorizzare nella cache il risultato. –

3

Per questi tipi di domande, raccomando The Design And Evolution di C++ di Bjarne Stroustrup. La sezione 13.9 descrive l'evoluzione dei membri protetti.

poco dopo il rilascio 1.0 [di Cfront], Mark Linton fermato da mio ufficio e ha fatto un appassionato appello per un terzo livello di controllo di accesso [...] ha sostenuto in modo persuasivo basa sulla vera e propria esperienza ed esempi dal codice vero e proprio che i dati protetti erano essenziali per la progettazione di un efficiente ed estensibile toolkit X Windows. [...] Questi erano buoni argomenti e essenzialmente quelli che mi hanno convinto a consentire ai membri protetti. [...]

Cinque anni più tardi, Mark ha vietato l'uso di membri di dati protetti in Interviste [X finestre toolkit accennato in precedenza] perché era diventato una fonte di bug. [...] Inoltre complicano seriamente la manutenzione [...]

I membri protetti sono stati introdotti nella versione 1.2. Le classi base protette sono state descritte per la prima volta nella versione 2.1. In retrospettiva, penso che lo protected sia un caso in cui "buoni argomenti" e la moda hanno superato il mio giudizio e le mie regole per accettare nuove funzionalità.

+2

Non potrei essere più d'accordo, i membri dei dati protetti sono una violazione dell'incapsulamento. Uso solo protetto per i metodi. –

+0

@Matt: A mio parere, i campi nelle classi dovrebbero sempre essere implicitamente privati ​​senza meccanismi per impedirlo, poiché entrambi i campi pubblici e protetti interrompono l'incapsulamento. – fredoverflow

+1

Ho la stessa opinione qui.Non puoi imporre un invariante di classe se esponi i tuoi dati membri. –

Problemi correlati