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