Страницы

Поиск по вопросам

вторник, 11 июня 2019 г.

Разница между типами методов private and protected

Пытаюсь разобраться в чем разница между private and protected в Ruby, но как то не очень получается. Из того что я понял, это то что приватный метод нельзя явно вызвать на экземпляре класса и он может быть вызван только другими методами этого же класса. А вот протектед вроде как можно вызвать явно, но в то же время и публичный метод можно вызвать явно, и он является чем-то средним между публичным и приватным. Так в чем же особенность протектеда, и где его следует использовать, можете мне объяснить (желательно с реальным примером). Буду очень благодарен.
UPDATE
И еще вопрос "вдогонку", private and private_class_method тоже не совсем понятна разница. Private это как методы класса, а private_class_method методы экземпляра, но ведь ни те ни другие не могут быть вызваны явно ни на чем кроме как методы в классе.


Ответ

Это не относится только к Ruby. Это относится ко всему ООП в целом.
Приватный метод (свойство) (он же private) - такой метод (свойство), доступ к которому можно получить только из того же класса (или объекта того же класса).
Защищенный метод (свойство) (он же protected) - такой метод (свойство), доступ к которому можно получить только из того же класса (или объекта того же класса) и из его наследников.
Публичный метод (свойство) (он же public) - такой метод (свойство), доступ к которому можно получить откуда угодно - извне определенного класса, из объекта определенного класса, из наследников.
А вот протектед вроде как можно вызвать явно
Нет, защищенные методы "защищены" от доступа извне, они являются приватными с той оговоркой, что к ним есть доступ у наследников класса, как уже было сказано выше. Разрешать доступ защищенному методу (свойству) извне не имеет смысла, так как такой метод (свойство) по определению станет публичным.
Про "вопрос вдогонку":
Не совсем понятно, о каких private_class_method идет речь. Если о статических методах и свойствах, то ограничение публичности предусмотрено для тех же целей.
Например, в статическое поле класса можно "сохранять" экземпляры, созданные конструктором этого же класса. При этом мы не хотим, чтобы пользователь имел доступ к списку созданных экземпляров извне, откуда-то снаружи, потому как этот список необходим только для какой-то сложной логики при создании экземпляра, например. А вот иметь возможность записывать в это свойство экземпляры внутри, скажем, конструктора, мы хотим. Поэтому делаем статическое свойство приватным, и тогда, например, из конструктора, у нас есть возможность сохранить экземпляр в свойство (назовем его instances), и из других методов класса его прочитать можем, а вот "снаружи" к нему обратиться (прочитать, записать) нельзя.
Вдобавок, пожалуй, стоит уточнить, что все методы (свойства) нужно делать максимально защищенными. Это хорошая практика. Делайте публичными только те свойства, к которым придется обращаться снаружи. Не оставляйте "служебные" свойства и методы публичными, поскольку вы никогда не можете знать, как их будут впоследствии использовать.

Комментариев нет:

Отправить комментарий