ruby中的私有方法和保护方法
ruby中的私有方法是指方法只能被隐含调用,不能被显示调用。而当没有显示接收者的时候,会把self当成接收者。因此,只能在自身中调用私有方法,这也是私有方法的调用规则。
ruby的私有方法机制目的是:使得你很容易将方法分为两种,外部世界可以访问的方法和外部世界不可以访问的方法。
如下:
1 class A 2 def a 3 self.method 4 end 5 def method 6 p "hello world" 7 end 8 private :method 9 end 10 A.new.a
method定义成私有方法,不能直接调用,只能通过a调用,但是方法a中是不能正常运行的。因为私有方法是要隐式调用的。去掉self就可以了。method的默认接收者就是A的实例对象,而method也是A的实例方法。
私有方法和单例方法的区别:
单例方法是某个对象的方法,它属于这个对象,默认情况它是公有的,当然你也可以设置它为私有。
私有的非单例方法,可以被任意数目的对象共享,但需要从合适的场合调用,是否可以调用私有方法的决定因素,不在于想要给哪个对象发送消息,而在于发送消息时哪个对象是self。
保护方法:
保护方法调用规则:只要默认对象self和你想要调用的方法所属的对象是同一个类的实例,你就可以调用该保护方法。
它的目的是让某个类的实例和该类的另一个实例协作完成某些任务。
如下:
1 class A 2 def initialize(n) 3 @n = n 4 end 5 6 def n 7 @n 8 end 9 10 def compare(c) 11 if c.n > n 12 puts "The other object is bigger" 13 else 14 puts "THe other object is smaller" 15 end 16 end 17 protected :n 18 end 19 c1 = A.new(100) 20 c2 = A.new(20) 21 c1.compare(c2)
这个程序是用来比较两个数的大小,它们都是同一个类的实例。因此用protected方法是合法的。
继承和私有方法
子类继承父类的方法访问权限规则。如果类C有一组访问权限规则,且类D是C的子类,那么D的实例将表现出和C的实例一样的访问权限规则。但是,如果类D中定义设置了新的访问权限规则,这样,新的规则将优先于继承的规则。