Personnally, I usually try to restrict my use of protected
to virtual
things.
I consider any other use of protected
as conceptually equivalent to public
. In the sense that if you write a non virtual protected method, write it as if it was public. Same for a field. If the field would break something if it was public, it will also break something if it's protected.
It doesn't mean it's bad to have a protected field or non virtual method, it just means you have to be careful and deliberate with their use, and know that someone, somewhere, can use those things and potentially break your class simply by deriving it.