you have to either know or check manually where MyFoo is defined
Ma come è specifico per proprietà protette ? Lo stesso vale per i metodi e davvero qualsiasi membro pubblico. Una grande ragione per l'eredità è evitare di dover ripetere la stessa cosa per ogni tipo concreto. Quindi puoi avere un tipo di base comune che contiene il comportamento di base e le definizioni di archiviazione di base.
Una proprietà o un campo in fase di protezione ti dice solo che questo è un dettaglio di implementazione interno che è probabile essere rilevante per le sottoclassi. In un certo senso, questo in realtà ti dice di più che avere proprietà private completamente disconnesse su ogni livello.
E il compilatore sa già dove è definito e come è accessibile. E i buoni editor ti diranno che in fase di progettazione, quindi non c'è davvero bisogno di "controllare manualmente". Inoltre, quando erediti un tipo, mi aspetto che tu sia a tuo agio con la sua interfaccia, quindi sai che ci sono membri protetti che puoi usare.
In our case these properties come from dependency injection
Questa potrebbe essere solo la mia opinione, ma userei sempre readonly
campi per le dipendenze, non per le proprietà.
So it's really easy to just map them to private properties from that constructor
Certo, potresti avere un campo privato su ogni livello della tua gerarchia di tipi. Ma questo duplicherà anche l'utilizzo della memoria di cui hai bisogno per tenere traccia di quelli. E se per un momento ignori il fatto che si tratta di dipendenze immutabili iniettate nel costruttore, una classe base che non è in grado di modificare il valore per le sue sottoclassi potrebbe anche introdurre problemi.
Are protected properties just a bad habit, and should I always go for private fields instead ?
Ci sono due domande qui: Proprietà vs. campo e protected
rispetto a private
. Per rispondere a quest'ultimo: utilizzare ciò che ha senso in un senso di incapsulamento. Se il tuo tipo base ha effettive API interne che le sottoclassi potrebbero utilizzare, queste dovrebbero essere protette. Ma non dovresti semplicemente rendere qualsiasi dipendenza protetta solo nel caso .