W Ruby dostęp do metod jest kontrolowany za pomocą trzech słów kluczowych:
public,
private i
protected. Słowa kluczowe te są używane do kontrolowania widoczności metod w klasie (
enkapsulacji).
Public (Metody publiczne)
Jeśli chodzi o metody publiczne - należy zapamiętać kilka podstawowych kwestii. Metody zadeklarowane jako publiczne mogą być wywoływane przez każdego - zarówno wewnątrz, jak i na zewnątrz klasy. Domyślnie wszystkie metody w klasie są publiczne. Można wskazać, że metoda jest publiczna, ale dla skrócenia i uproszczenia kodu tego się nie robi.
class MyClass
def public_method_name
# Ta metoda jest domyślnie publiczna
end
public :public_method_name # Wyraźnie wskazujemy ją jako publiczną, ale można tego nie robić
end
class MyClass
def public_method_name
# Ta metoda jest domyślnie publiczna
end
end
Przykłady są technicznie identyczne - public_method_name to metoda publiczna.
Private (Metody prywatne)
Metody zadeklarowane jako prywatne mogą być wywoływane tylko wewnątrz tej klasy, w której są zdefiniowane. Nie można ich wywołać z zewnątrz klasy, nawet z instancji tej klasy.
class MyClass
private # wszystkie metody, które idą po tej linii - są prywatne
def private_method_name
# Ta metoda jest prywatna
end
end
Protected (Metody chronione)
Metody zadeklarowane jako protected (chronione) mogą być wywoływane tylko wewnątrz tej samej klasy lub instancji jej podklas. Podobnie jak w przypadku dostępu prywatnego, ale zapewnia dostęp dla podklas.
class MyClass
protected # wszystkie metody, które idą po tej linii - są chronione
def protected_method
# Ta metoda jest chroniona
end
end
Pytania dotyczące public, private i protected często pojawiają się na rozmowach kwalifikacyjnych. Najlepiej ta informacja jest przyswajana, gdy uczy się na przykładach / ćwiczeniach. Na przykład:
Ćwiczenie na naukę metod public, private i protected
Utwórz klasę "Użytkownik" (User):
- Utwórz klasę User z następującymi właściwościami: imię (name) i wiek (age).
- Wszystkie właściwości powinny być prywatne.
Dodaj metody:
- Dodaj metodę witać się (greet), która wyświetla wiadomość: "Cześć, jak leci?"
- Dodaj metodę dostęp_do_wieku (access_age), która zwraca wiek użytkownika.
Zmień poziomy dostępu:
- Uczyń metodę greet publiczną.
- Uczyń metodę access_age chronioną.
Utwórz podklasę "Administrator" (Admin):
- Utwórz podklasę Admin, która dziedziczy po klasie User.
Sprawdź działanie:
- Utwórz obiekt klasy User i obiekt klasy Admin.
- Wywołaj metodę greet na obiektach obu klas.
- Spróbuj uzyskać dostęp do wieku za pomocą metody access_age na obiekcie klasy User i spróbuj to samo na obiekcie klasy Admin.
Zapisz swoje obserwacje:
- Zapisz, które metody wywołałeś pomyślnie, a które spowodowały błąd.
- Określ, które metody można wywołać z zewnątrz klasy, a które nie.
Optymalizuj kod (refaktoryzacja)
- zorganizuj kod
- zmień nazwy metod na bardziej zrozumiałe (access_age -> age)
Oto szkielet kodu, który może ci trochę pomóc w orientacji:
class User
def initialize(name, age)
@name = name
@age = age
end
def greet
puts "Cześć, jak leci?"
end
def access_age
@age
end
private
def private_method
puts "To jest metoda prywatna"
end
protected
def protected_method
puts "To jest metoda chroniona"
end
end
class Admin < User
# Admin dziedziczy wszystkie właściwości i metody z User
end
# Tworzenie obiektów
user = User.new("Użytkownik", 25)
admin = Admin.new("Administrator", 30)
# Wywołanie metody publicznej
user.greet
admin.greet
# Próba wywołania metody chronionej
# user.protected_method # Spowoduje błąd
# Próba wywołania metody prywatnej
# user.private_method # Spowoduje błąd
# Wyjście wieku
puts "Wiek użytkownika: #{user.access_age}"
puts "Wiek administratora: #{admin.access_age}"
Jeśli to ćwiczenie wydaje się trudne - wróć do niego za jakiś czas. Powtórz, jak działają klasy, co to jest initialize, co to jest instancja klasy itd.