У Ruby існують три основні рівні доступу до методів: public
, protected
та private
. Розглянемо детально відмінності між private
і protected
методами.
- Область видимості:
- Private: Метод доступний лише всередині класу або модуля, де він оголошений. Не можна викликати метод ззовні класу або з іншого екземпляра класу.
- Protected: Метод доступний всередині класу, де він оголошений, а також у підкласах. Метод може бути викликаний іншими екземплярами того ж класу або підкласів.
- Спосіб виклику:
- Private: Метод може бути викликаний лише неявно, тобто без вказання приймача (неможливо використовувати
self
або ім’я іншого об’єкта перед ім’ям методу). - Protected: Метод може бути викликаний як неявно, так і явним чином (з використанням
self
або іншого об’єкта того ж класу чи підкласу).
- Приклад використання:
class Example
private
def private_method
"This is a private method"
end
end
ex = Example.new
ex.private_method # виклик ззовні класу, призведе до помилки
class Example
protected
def protected_method
"This is a protected method"
end
def call_protected(other)
other.protected_method # правильний виклик
end
end
ex1 = Example.new
ex2 = Example.new
ex1.call_protected(ex2) # виклик можливий, тому що метод protected
ex1.protected_method # виклик ззовні класу, призведе до помилки
- Спадкування:
- Private: Не можуть бути викликані з підкласів явним чином. Виклик можливий лише неявно всередині класу.
- Protected: Можуть бути викликані з підкласів як неявно, так і явним чином.
- Інкапсуляція:
- Private: Забезпечують високий рівень інкапсуляції, оскільки обмежують доступ до методу лише поточним об’єктом.
- Protected: Забезпечують менший рівень інкапсуляції, дозволяючи доступ з інших екземплярів того ж класу або підкласів.
Висновок
Private
методи є більш обмеженими та приховують деталі реалізації краще, ніж protected
методи, оскільки protected
методи можуть бути викликані іншими екземплярами того ж класу або його підкласів, що робить їх більш доступними в межах ієрархії класів.