`
凌川__
  • 浏览: 82312 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

6.5 访问控制

阅读更多

在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象的方法。控制了对方法的访问,也就控制了对对象属性的访问。
控制对方法的访问,有三种方式: 

访问控制
意义
public 
可以被任何实例对象调用,不存在访问控制;
protected
可以被定义它的类和其子类访问,
可以在类中或子类中指定给实例对象;
private
可以被定义它的类和其子类访问,
不能被实例对象调用。

方法默认都是公有的( initialize方法除外,它永远是私有的)。
看程序  E6.5-1.rb :

ruby 代码

  1. #E6.5-1.rb     
  2. class Person     
  3.  def talk   
  4.     puts "    public :talk,   将调用speak"  
  5.     speak   
  6.   end       
  7.   
  8.   def speak   
  9.     puts "protected :speak,将调用laugh"  
  10.     laugh   
  11.   end       
  12.   
  13.   def laugh   
  14.     puts "   private:laugh"        
  15.   end       
  16.   protected :speak  
  17.   private    :laugh  
  18. end  
  19.   
  20. p1=Person.new  
  21. p1.talk   
  22. #p1.speak   实例对象不能访问protected方法   
  23. #p1.laugh    实例对象不能访问private方法   

 运行结果:
>ruby E6.5-1.rb
    public :talk, 将调用speak
protected:speak,将调用laugh
   private:laugh
>Exit code: 0

再看程序  E6.5-2.rb :

ruby 代码
  1. #E6.5-2.rb     
  2.   
  3. class Person     
  4.      
  5.   def speak   
  6.     "protected:speak  "  
  7.   end     
  8.      
  9.   def laugh   
  10.     "   private:laugh"      
  11.   end    
  12.      
  13.   protected :speak  
  14.   private     :laugh  
  15. end  
  16.   
  17. class Student < Person     
  18.      
  19.   def useLaugh   
  20.     puts laugh   
  21.   end     
  22.      
  23.   def useSpeak   
  24.     puts speak   
  25.   end     
  26.      
  27. end  
  28. p2=Student.new  
  29. p2. useLaugh         # =>    private:laugh   
  30. p2. useSpeak         # =>  protected:speak    



从程序 E6.5-1.rb 和程序 E6.5-2.rb ,我们没有看出 protected 和 private 的区别,到底区别在哪里呢?
答案在程序  E6.5-3.rb :

ruby 代码
  1. #E6.5-3.rb    
  2.   
  3. class Person       
  4.   def speak   
  5.     "protected:speak  "  
  6.   end     
  7.      
  8.   def laugh   
  9.     "   private:laugh"      
  10.   end    
  11.      
  12.   protected :speak  
  13.   private     :laugh  
  14.      
  15.   def useLaugh(another)       
  16.     puts another.laugh   #这里错误,私有方法不能指定对象   
  17.   end     
  18.      
  19.   def useSpeak(another)      
  20.     puts another.speak   
  21.   end     
  22.      
  23. end  
  24.   
  25. p1=Person.new    
  26. p2=Person.new  
  27.   
  28. p2.useSpeak(p1)          # =>  protected:speak   
  29. #p2.useLaugh(p1)  


从上面三个程序可以得出结论:
 public方法,可以被定义它的类和其子类访问,可以被类和子类的实例对象调用;
 protected方法,可以被定义它的类和其子类访问,不能被类和子类的实例对象直接调用,但是可以在类和子类中指定给实例对象;
 private方法,可以被定义它的类和其子类访问,私有方法不能指定对象。


Ruby语言的访问控制是动态的,是在程序运行时刻确立的。你可以根据自己的需要,在程序的不同位置,改变某个方法的访问控制级别,让你的程序更加富于变化。

ruby 代码
  1. #E6.5-4.rb     
  2. class Person       
  3.   private    #后面的方法设定为private   
  4.   def talk   
  5.     puts " already talk "  
  6.   end        
  7. end  
  8.   
  9. p1=Person.new  
  10. #p1.talk   private方法不能访问   
  11.   
  12. class Person         
  13.   public :talk  
  14. end  
  15.   
  16. p1.talk     # =>  already talk  


 

完整阅读,请看我写的 Ruby语言中文教程all in one    
 

分享到:
评论

相关推荐

    Reflector6.5升级后最新版

    具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。  基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像...

    tuxedo6.5.rar

    它还使用通用的通信协议,如传输控制协议/因特网协议(TCP/IP)和网络基本输入输出系统(NetBIOS),并且可以在这些环境提供分布式处理支持。例如,它可以根据请求的类型,服务请求从一个客户选择路由到一个特定的服务器...

    NiceLabel(条码标签设计软件) v6.5.1.12539.rar

    3、使用NiceLabel标签设计软件和打印机驱动程序获得最大性能和对任何激光或喷墨打印机的控制。2500多种标签打印机的Windows标准驱动程序;标签打印机条形码、字体和其他功能的原生支持;经微软测试的卓越的Windows...

    VMware ESXi-6.5.0.x86_64整合rtl8168等驱动附6.0u3客户端

    在基于VMware ESXi-6.5.0-4564106最后一版可被VMware vSphere Client6.0u3客户端访问及部分功能控制的iso上,加载了: net55-r8168 net51-r8169 net-igb sata-xahci 四种驱动,可直接下载安装。在x79-ss双路主板...

    ## 凌云论坛LyBBS v6.5 Build 20060816

    6、第一次访问论坛不再需要刷新一次才能访问; 7、支持跳过验证码配置(后台增加validateCodeEnabled一项,置成false即关闭验证码验证); 8、支持注册协议模板; 9、支持发送欢迎消息的模板; 8、完善了短消息提醒...

    Reflector 6.5.0.135

    具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。  基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像...

    反编译工具.NET Reflector 6.5.0.135

    具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。  基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像...

    基于Matlab实现媒体访问控制协议(Aloha 和 CSMA).zip

    1.版本:matlab2014/2019a/2021a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab...##### 6.5 无人机通信中继优化 #####

    模拟开槽 Aloha 媒体访问控制层的 Matlab 代码+运行结果.zip

    1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容...##### 6.5 无人机通信中继优化

    H分公司网络搭建.docx

    7.3访问控制列表验证(show ip access-list ) 7.4查看路由表(show ip route) 7.5DHCP动态获取IP地址验证 7.6查看生成树(show spanning-tree) 7.7查看地址池 八、网络故障维护 九、成员分工 十、...

    基于JAVA WEB SSH框架的小区物业管理系统(源码+数据库).zip

    用JSP编写的WEB网页模板以及用MyEclipse6.5、Tomcat6.0S、QLServer2005 Struts2、Spring3.0、Hibernate3.3等技术编写的源代码。 整个项目采用MVC模式,应用Struts Spring Hibernate三个框架实现了一个小区管理系统...

    海康CH-HCNetSDKV5.3.6.30sdk_Win32_Win64.zip

    设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、NVR、网络摄像机、网络球机、视频服务器、解码器、报警主机、网络存储等产品服务的配套模块,用于远程访问和控制设备软件的二次开发。...

    XXX软件系统安全保障方案.doc

    软件系统安全保障方案,包括目录结构和一些通用性的描述。目录结果: 安全保障方案 1 目 录 1 ...6.3 信息访问控制 8 6.4 系统日志与审计 8 6.5 数据完整性 8 7、 安全管理体系 8 8、 其他 9

    物业管理系统java+jsp+sql server2005

    分为View层(显示层)、Control层(控制层)、Service层(业务逻辑层)、DAO层(数据库访问对象层)。利用Spring的依赖注入和面向切面特性,hibernate的数据持久化技术、Struts的控制器实现了楼栋管理模块,房间管理...

    现代化小区物业管理系统源码(java)

    此资源包含了用户需求说明文档、用JSP编写的WEB网页模板以及用MyEclipse6.5、Tomcat6.0S、QLServer2005 、Struts2、Spring3.0、Hibernate3.3等技术编写的源代码。 整个项目采用MVC模式,应用Struts Spring ...

Global site tag (gtag.js) - Google Analytics