В Ruby доступ до методів контролюється за допомогою трьох ключових слів:
public,
private і
protected. Ці ключові слова використовуються для контролю видимості методів у класі (
інкапсуляції).
Public (Публічні методи)
Щодо публічних методів - треба запам'ятати декілька основних моментів. Методи, оголошені як публічні, можуть бути викликані будь-ким - як всередині, так і поза класом. За замовчуванням всі методи в класі є публічними. Можна вказати, що метод є публічним, але для скорочення та спрощення коду цього не робиться.
class MyClass
def public_method_name
# Цей метод за замовчуванням публічний
end
public :public_method_name # Явно вказуємо його як публічний, але можна й не вказувати
end
class MyClass
def public_method_name
# Цей метод за замовчуванням публічний
end
end
Приклади технічно ідентичні - public_method_name це публічний метод.
Private (Приватні методи)
Методи, оголошені як приватні, можуть бути викликані тільки всередині того класу, де вони визначені. Їх не можна викликати ззовні класу, навіть з екземпляра цього класу.
class MyClass
private # всі методи що йдуть після цієї строки - приватні
def private_method_name
# Цей метод приватний
end
end
Protected (Захищені методи)
Методи, оголошені як protected (захищені), можуть бути викликані тільки всередині того самого класу або екземплярів його підкласів. Cхоже на приватний доступ, але забезпечує доступ для підкласів.
class MyClass
protected # всі методи що йдуть після цієї строки - захищені
def protected_method
# Цей метод захищений
end
end
Питання про public, private та protected доволі часто зустрічаються на співбесідах. Краще за все ця інформація засвоюється коли вчишся на прикладах / вправах. Наприклад:
Вправа на вивчення public, private та protected методів
Створіть клас "Користувач" (User):
- Створіть клас User із наступними властивостями: ім'я (name) та вік (age).
- Всі властивості повинні бути приватними.
Додайте методи:
- Додайте метод вітатися (greet), який виводить повідомлення: "Привіт, як справи?"
- Додайте метод доступ_до_віку (access_age), який повертає вік користувача.
Змініть рівні доступу:
- Зробіть метод greet публічним.
- Зробіть метод access_age захищеним.
Створіть підклас "Адміністратор" (Admin):
- Створіть підклас Admin, який успадковує клас User.
Перевірте роботу:
- Створіть об'єкт класу User та об'єкт класу Admin.
- Викличте метод greet на об'єктах обох класів.
- Спробуйте отримати доступ до віку за допомогою методу access_age на об'єкті класу User та спробуйте це саме на об'єкті класу Admin.
Запишіть свої спостереження:
- Запишіть, які методи ви викликали успішно, а які призвели до помилки.
- Визначте, які методи можна викликати ззовні класу, а які ні.
Оптимізуйте код (рефакторінг)
- організуйте код
- змініть назви методів на більш зрозумілі (access_age -> age)
Ось скелет коду, який вам може трохи допомогти зорієнтуватись:
class User
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "Привіт, як справи?"
end
def access_age
@age
end
private
def private_method
puts "Це приватний метод"
end
protected
def protected_method
puts "Це захищений метод"
end
end
class Admin < User
# Admin успадковує всі властивості та методи з User
end
# Створення об'єктів
user = User.new("Користувач", 25)
admin = Admin.new("Адміністратор", 30)
# Виклик публічного методу
user.greet
admin.greet
# Спроба викликати захищений метод
# user.protected_method # Призведе до помилки
# Спроба викликати приватний метод
# user.private_method # Призведе до помилки
# Вивід віку
puts "Вік користувача: #{user.access_age}"
puts "Вік адміністратора: #{admin.access_age}"
Якщо ця вправа здається заважкою - поверніться до неї через деякий час. Повторіть як працюють класи, що таке initialize, що таке екземпляр класу тощо.