Private оправдан в тех случаях, если неправильное переопределение метода или атрибута наследником может привести к появлению некорректного состояния объекта (реализации нарушения инкапсуляции).
Ваша ошибка в том, что вы сравниваете protected в первую очередь c private, хотя на самом деле разница между protected и public намного меньше, чем между private и protected.
Рассматривайте public и protected как аpi вашего класса. Тольк public — это внешний api (для пользователей класса), а protected — внутренний (для наследников класса).