L'idea di base è che un "campo" (variabile a livello di istanza) dichiarato come protetto sia probabilmente più visibile di quanto debba essere e meno "protetto" di quanto si possa desiderare. Non esiste un modificatore di accesso in C / C ++ / Java / C # equivalente a "accessibile solo da classi figlio all'interno dello stesso assembly", garantendo così la possibilità di definire i propri figli che possono accedere al campo nell'assembly, ma non consentire ai bambini creati in altri assembly lo stesso accesso; C # ha modificatori interni e protetti, ma combinarli rende l'accesso "interno o protetto", non "interno e protetto". Quindi, un campo protetto è accessibile da qualsiasi bambino, indipendentemente dal fatto che tu abbia scritto quel bambino o qualcun altro. Protetto è quindi una porta aperta per un hacker.
Inoltre, i campi in base alla loro definizione non hanno praticamente alcuna validità inerente al loro cambiamento. in C # puoi creare una sola lettura, il che rende i tipi di valore effettivamente costanti ei tipi di riferimento che non possono essere reinizializzati (ma comunque molto mutevoli), ma questo è tutto. Come tali, anche protetti, i tuoi figli (di cui non puoi fidarti) hanno accesso a questo campo e possono impostarlo su qualcosa di non valido, rendendo lo stato dell'oggetto incoerente (qualcosa da evitare).
Il modo accettato di lavorare con i campi è renderli privati e accedervi con una proprietà e / o un metodo getter and setter. Se tutti i consumatori della classe hanno bisogno del valore, rendono il getter (almeno) pubblico. Se solo i bambini ne hanno bisogno, proteggi il getter.
Un altro approccio che risponde alla domanda è chiedersi; perché il codice in un metodo figlio ha bisogno della possibilità di modificare direttamente i miei dati di stato? Cosa dice di quel codice? Questa è l'argomento della "distanza verticale" sul suo volto. Se c'è un codice in un bambino che deve alterare direttamente lo stato genitore, allora forse quel codice dovrebbe appartenere al genitore in primo luogo?