La mia domanda riguarda Java, ma può anche essere applicata a C#. Mi chiedevo perché tutti consigliano di rendere le variabili di istanza private invece di renderle protette da .Perché si consiglia di dichiarare variabili di istanza come private?
Pensaci. Le variabili private non sono viste dalla sottoclasse, quindi se ho bisogno di accedere o modificare le variabili della superclasse nella mia sottoclasse sono costretto a usare un metodo di accesso e mutatore come getMyPrivateVariable
o setMyPrivateVariable
. Ma quando estendi qualche classe ed erediti i suoi membri, questo funziona come se li avessi dichiarati direttamente nella sottoclasse. Quindi logicamente ciò significa che la sottoclasse dovrebbe anche avere accesso diretto alle variabili di istanza e fare un caso per progettare la classe con variabili protette. Capisco che una simile pratica romperebbe l'incapsulamento, ma ciò sembra irrilevante nel caso dell'ereditarietà, perché, ancora una volta, in questo caso tutto funziona come se i membri della superclasse fossero dichiarati nel sottolocalcio, quindi il sottoprodotto ha un "diritto naturale" per poter accedere direttamente ai suoi membri, indipendentemente dal fatto che siano stati ereditati o meno. L'incapsulamento, a mio parere, è più importante per l'interfacciamento con l'oggetto con altri oggetti che si trovano all'esterno dell'albero di ereditarietà dell'oggetto.
Quindi, la mia domanda è perché tutti consigliano di dichiarare le variabili di istanza della classe come private piuttosto che protette?
Questa è una domanda adatta per programmers.stackexchange.com piuttosto che StackOverflow. – m3th0dman
Non _everyone_ fa. Ma dal tuo testo sembra che tu abbia il punto di "protetto"; in ogni caso, fai ciò che ritieni giusto. – fge
Solo perché una classe consente l'ereditarietà non significa che voglia consentire la corruzione arbitraria dei suoi invarianti interni da classi figlio. Rendere i campi (e alcuni metodi) 'private' lo consente. – dlev