Ruby Access Control
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 ...
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!