Ruby Access Control
Bài đăng này đã không được cập nhật trong 8 năm
Truy cập các phương thức trong Ruby
Để thay đổi trạng thái của một đối tượng trong lập trình hướng đối tượng ta phải thông qua các phương thức (method) mà đối tượng này cung cấp. Vậy việc truy cập các method trong Ruby như thế nào?
Ruby cung cấp 3 mức độ bảo vệ cho các phương thức của mình
-
public: phương thức này có thể gọi từ bất cứ đâu, có thể coi như không có kiểm soát hay giới hạn truy cập.
-
protected: phương thức này có thể được gọi từ một đối tượng của lớp này hoặc một đối tượng là con của lớp này.
-
private: phương thức này chỉ được gọi từ chính nó (đối tượng gọi và đối tượng nhận là một).
Dưới đây là một số ví dụ về quyền truy cập các method trong Ruby
1. Truy cập từ một đối tượng khác lớp (đối tượng gọi phương thức và đối tượng nhật phương thức thuộc 2 lớp khác nhau)
class AccessControll
def test_public
puts "public access OK"
end
protected
def test_protected
puts "protected access OK"
end
private
def test_private
puts "private access OK"
end
end
class Test
def test
aceess_controll = AccessControll.new
aceess_controll.test_public # public access OK
aceess_controll.test_protected # NoMethodError
aceess_controll.test_private # NoMethodError
end
end
Test.new.test
Trong ví dụ trên chúng ta kiểm tra bằng các gọi đến các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng thuộc lớp Test. Vì đối tượng gọi đến các phương thức trên không thuộc lớp AccessControll nên chỉ gọi được các phương thức public của đối tượng nhận, còn những phương thức là protected và private thì không thể truy cập được.
2. Truy cập từ một đối tượng khác thuộc cùng một lớp (2 đối tượng gọi và nhận phương thức thuộc cùng một lớp)
class AccessControll
def test other
other.test_public # public access OK
other.test_protected # protected access OK
other.test_private # NoMethodError
end
def test_public
puts "public access OK"
end
protected
def test_protected
puts "protected access OK"
end
private
def test_private
puts "private access OK"
end
end
AccessControll.new.test AccessControll.new
Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác cũng thuộc lớp này. Vì đối tượng gọi phương thức có lớp giống với đối tượng nhận phương thức nên có thể gọi các phương thức public và proctected của đối tượng nhận, còn phương thức private thì không truy cập được.
3. Truy cập từ một đối tượng thuộc lớp con (đối tượng gọi có lớp là lớp con của đối tượng nhận)
class AccessControll
def test_public
puts "public access OK"
end
protected
def test_protected
puts "protected access OK"
end
private
def test_private
puts "private access OK"
end
end
class Children < AccessControll
def test other
other.test_public # public access OK
other.test_protected # protected access OK
other.test_private # NoMethodError
end
end
Children.new.test AccessControll.new
Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác thuộc lớp con của lớp này. Vì đối tượng gọi phương thức có lớp là lớp con so với lớp của đối tượng nhận phương thức nên có thể gọi các phương thức public và proctected của đối tượng nhận, còn phương thức private thì không truy cập được.
4. Truy cập từ một đối tượng thuộc lớp cha (đối tượng gọi có lớp là lớp cha của đối tượng nhận)
class Parent
def test other
other.test_public # public access OK
other.test_protected # protected access OK
other.test_private # NoMethodError
end
end
class AccessControll < Parent
def test_public
puts "public access OK"
end
protected
def test_protected
puts "protected access OK"
end
private
def test_private
puts "private access OK"
end
end
Parent.new.test AccessControll.new
Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ một đối tượng khác thuộc lớp cha của lớp này. Vì đối tượng gọi phương thức có lớp là lớp cha so với lớp của đối tượng nhận phương thức nên có thể gọi các phương thức public của đối tượng nhận, còn phương thức protected và private thì không truy cập được.
5. Truy cập từ cùng một đối tượng (đối tượng gọi phương thức và đối tượng nhận phương thức là 1 đối tượng duy nhất)
class AccessControll
def test
test_public # public access OK
test_protected # protected access OK
test_private # private access OK
end
def test_public
puts "public access OK"
end
protected
def test_protected
puts "protected access OK"
end
private
def test_private
puts "private access OK"
end
end
AccessControll.new.test
Trong ví dụ trên chúng ta kiểm tra bằng cách gọi các phương thức của một đối tượng thuộc lớp AccessControll từ chính nó. Vì đối tượng gọi và đối tượng nhận phương thức là một nên có thể gọi đến tất cả các phương thức public, protected và private.
Hy vọng qua các ví dụ trên có thể giúp các bạn hiểu thêm về quyền truy cập đến các phương thức trong Ruby. Cảm ơn đã theo dõi bài viết!
All rights reserved