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
risposta
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
)
Il modo migliore sarebbe probabilmente utilizzare un metodo virtuale 'getArea'. –
@Matthieu: Sì, ma ciò significherebbe ricalcolare l'area ogni volta che viene chiamata. – SLaks
Non necessariamente, dipende dalla forma derivata per decidere se vale la pena memorizzare nella cache il risultato. –
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à.
Non potrei essere più d'accordo, i membri dei dati protetti sono una violazione dell'incapsulamento. Uso solo protetto per i metodi. –
@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
Ho la stessa opinione qui.Non puoi imporre un invariante di classe se esponi i tuoi dati membri. –
- 1. Quali sono le motivazioni alla base della compilazione in byte-code?
- 2. Accesso protetto con socket
- 3. Lo specificatore di accesso è importante per una funzione amico?
- 4. Qual è il significato dello specificatore di formattazione% m?
- 5. C++ di errore: funzione base è protetto
- 6. Come organizzare un livello di accesso alla base dati?
- 7. Accesso alla classe base typedef nel modello di classe derivata
- 8. Uso dello specificatore volatile in C/C++/Java
- 9. IllegalAccessError: accesso a un metodo protetto
- 10. joomla 1.7 accesso: menu protetto params
- 11. accesso a un URL protetto da password
- 12. Accesso protetto con autenticazione corretta in PHP
- 13. Imposta il colore dello sfondo in base alla temperatura esterna
- 14. Ridimensionare le immagini in base alla risoluzione dello schermo Android
- 15. Riflesso Java - campo protetto da accesso
- 16. Polymorphism: derivante da un membro protetto in una classe base?
- 17. Posso creare un metodo con accesso protetto Java in Scala?
- 18. Impossibile accedere membro protetto della classe base in classe derivata
- 19. Perché Session.Evict in OnPostUpdate causa l'eccezione "Possibile accesso non protetto alla sessione"?
- 20. Perché non c'è un modificatore di accesso protetto in F #?
- 21. impatto Sicurezza dei modificatori di accesso (pubblico, privato, interno, protetto)
- 22. Metodo di sovrascrittura che non ha modificatore di accesso con modificatore di accesso protetto
- 23. Accesso alla memoria Haswell
- 24. Verifica dello stato di accesso lato client
- 25. interno protetto
- 26. override con le specifiche di accesso alle differenze C++
- 27. Accesso alla cartella WP8
- 28. Accesso alla rete RavenDB
- 29. Accesso alla webcam multipiattaforma
- 30. Specificatore Float to String
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". –