Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
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.
Якщо всі методи матимуть модифікатор доступу public, це призведе до того, що всі інші класи та компоненти програми матимуть безперешкодний доступ до цих методів.
Це може призвести до непередбачуваних конфліктів у програмі.
З іншого боку, це може полегшити взаємодію між класами та сприяти швидкої розробці, але такий підхід не завжди є безпечним і може породжувати проблеми зі збереженням даних та конфіденційністю.