Я часто вижу, что программисты предпочитают вообще не определять «частные» члены класса. Вместо этого они определяют только «защищенные» члены, объясняя это тем, что они не знают, будут ли этот метод или это свойство использоваться в дочерних классах или нет. Поэтому, чтобы заранее обезопасить себя и свести к минимуму рабочие усилия, необходимые в будущем, они думают, что лучше иметь всех членов класса «под защитой».

Что ж, это умный ход, но языки программирования позволяют иметь «закрытых» участников по какой-то причине.

Во-первых, наличие в классе только «защищенных» членов нарушает инкапсуляцию с точки зрения родительского класса. Он позволяет пользователям изменять состояние и поведение, унаследованное от родительского класса, даже если автор родительского класса этого не планировал.

Очевидно, это противоречит принципам ООП и может легко вызвать проблемы. По той же причине мы можем просто сделать всех членов класса «общедоступными» и молиться, чтобы пользователи не испортили внутреннюю логику экземпляра.

Помните, чем больше информации вы храните в секрете, чем меньше вещей нужно защищать, тем более стабильный код вы получите.

Затем, если в классе больше «частных» и менее «защищенных» членов, ваша уверенность в проведении рефакторинга этого класса значительно возрастет.

Если вы хотите изменить логику или переименовать один из «частных» методов класса, вы на 100% уверены, что этот метод используется только внутри этого класса. Следовательно, для этого требуется меньше усилий, меньше внимания и больше уверенности. Напротив, когда вы видите, что все методы в классе «защищены», вы предпочитаете вообще не трогать их, потому что не знаете, где еще они используются в проекте. Вы не уверены, какие дочерние классы относятся к этим методам, и, как следствие, их изменения могут быть слишком напряженными и опасными.

Резюме

Надеюсь, я убедил некоторых программистов отдать предпочтение «частным» членам и дважды подумать, прежде чем определять «защищенные» члены.

В некотором роде «защищенные» и «общественные» члены идентичны по своей природе. Единственное отличие - это уровень доступа.