在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象的方法。控制了对方法的访问,也就控制了对对象属性的访问。
控制对方法的访问,有三种方式:
访问控制
|
意义
|
public
|
可以被任何实例对象调用,不存在访问控制;
|
protected
|
可以被定义它的类和其子类访问,
可以在
类中
或子类中
指定
给实例对象;
|
private
|
可以被定义它的类和其子类访问,
不能被实例对象调用。
|
方法默认都是公有的( initialize方法除外,它永远是私有的)。
看程序 E6.5-1.rb :
ruby 代码
- #E6.5-1.rb
- class Person
- def talk
- puts " public :talk, 将调用speak"
- speak
- end
- def speak
- puts "protected :speak,将调用laugh"
- laugh
- end
- def laugh
- puts " private:laugh"
- end
- protected :speak
- private :laugh
- end
- p1=Person.new
- p1.talk
- #p1.speak 实例对象不能访问protected方法
- #p1.laugh 实例对象不能访问private方法
运行结果:
>ruby E6.5-1.rb
public :talk, 将调用speak
protected:speak,将调用laugh
private:laugh
>Exit code: 0
再看程序 E6.5-2.rb :
ruby 代码
- #E6.5-2.rb
- class Person
- def speak
- "protected:speak "
- end
- def laugh
- " private:laugh"
- end
- protected :speak
- private :laugh
- end
- class Student < Person
- def useLaugh
- puts laugh
- end
- def useSpeak
- puts speak
- end
- end
- p2=Student.new
- p2. useLaugh # => private:laugh
- p2. useSpeak # => protected:speak
从程序 E6.5-1.rb 和程序 E6.5-2.rb ,我们没有看出 protected 和 private 的区别,到底区别在哪里呢?
答案在程序 E6.5-3.rb :
ruby 代码
- #E6.5-3.rb
- class Person
- def speak
- "protected:speak "
- end
- def laugh
- " private:laugh"
- end
- protected :speak
- private :laugh
- def useLaugh(another)
- puts another.laugh #这里错误,私有方法不能指定对象
- end
- def useSpeak(another)
- puts another.speak
- end
- end
- p1=Person.new
- p2=Person.new
- p2.useSpeak(p1) # => protected:speak
- #p2.useLaugh(p1)
从上面三个程序可以得出结论:
public方法,可以被定义它的类和其子类访问,可以被类和子类的实例对象调用;
protected方法,可以被定义它的类和其子类访问,不能被类和子类的实例对象直接调用,但是可以在类和子类中指定给实例对象;
private方法,可以被定义它的类和其子类访问,私有方法不能指定对象。
Ruby语言的访问控制是动态的,是在程序运行时刻确立的。你可以根据自己的需要,在程序的不同位置,改变某个方法的访问控制级别,让你的程序更加富于变化。
ruby 代码
- #E6.5-4.rb
- class Person
- private #后面的方法设定为private
- def talk
- puts " already talk "
- end
- end
- p1=Person.new
- #p1.talk private方法不能访问
- class Person
- public :talk
- end
- p1.talk # => already talk
完整阅读,请看我写的 Ruby语言中文教程all in one