Ну если подходить философски) , то класс это довольно самодостаточный кусок кода. Т.е. если что-то случилось, то ты идешь в этот класс и исправляешь или (дополняешь его - что не совсем правильно). т.е. функциональность лежит в одном месте (этакая модульность) и не размазана по коду. Все рады и поют пиво. Встает вопрос как разбить программу на такие классы. На помощь приходит принцип инверсиии зависимостей. Звучит страшно, но на деле это разработка сверху вниз. Т.е. пишешь ты работу со счетами. Понадобилось сохранять счета. Этокое хранилище. У него вырисовывается метод сохранитьсчет. Хорошо делам заглушку Хранилище, с методом сохранить. Затем по мере реализации логики, понадобился метод загрузитьсчет. вставляем в хранилище.
т.е. у нас вырисовывается интерфейс класса Хранилище который требуется для логики. И метода этого интерфейса будут все public. и ничего лишнего.
Отлично. приходит помощник, мы говорим "у меня нет время, но есть работа. нужно реализовать методы моего хранилища" Помощник берет за основу ваш интерфейс и реализовывает свою Impl. Методы интерфейса public, и остальные которые он выделил для своего удобства privat. Все рады и работа сменяется зависоном на toster.ru. но приходит начальник и говорит"wtf?!!!" ..;%:;№. "вы сделали реализацию на mysql, а у нас полклиентов работает на оракле!"
Вы берете Impl, медитируете и понимаете, что можно в принципе переписать только часть класса для оракла, а часть оставить. но люди продвинутые и понимаете, что общий код можно выделить в базовый класс. Итак у вас вырисовывается Общий класс в котором есть public, private, protected. public и protected - могут быть абстрактными. Отлично. Вы реализовываете только часть которую нужно для оракла и все готово. Более того если нужно подключить MSSQL, вы легко это сделаете.
Вот такая сказка. В ней намек - не плодите лишнего в интерфейсе. выделяйте то что нужно. Не делайте лишнего protected. только то что нужно переиспользовать потомками. Вы же не фреймворки пишите. Заранее не нужно впихивать ненужное.