论坛首页 编程语言技术论坛

Ruby创建对象以及类和对象之间交互

浏览 2540 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  

一、从类中创建对象
      类Class定义的实例方法Class#new将创建接受者对应的类的对象。这个是通过调用classexpr.allocate来完成的。可以重载 这个方法,但是必须返回正确的类的对象。然后调用新创建的对象的initialize,并将传递给new的参数传递给initialize。
    注意:
     1、如果类定义中重载了类方法new,并且new没有调用super,那么将无法创建该类的对象,并调用new将返回nil
     2、通常initialize应当调用super,用于对父类进行初始化。
  二、类和对象之间的交互
     1、简单对象
       如图:


       其中klass用于指向对象的类引用,用于指向class对象的。super是用于指向父类。
     2、类对象
        在类定义中我们提到了,类定义是一段可执行的代码,并且是在某个对象作为上下文中执行,这样每个类本身就是一个对象。下图中展示了类和对象的全局图。每个类对象的klass都会隐含的指向一个虚拟类metaclass,所有类定义的类方法都是放到这个metaclass中的,当方法的接受者是类对象时,ruby就会直接到该metaclass中查找相应 的方法。可以这样理解,metaclass就是类对象的类。

        既然类是对象,那么类对象就可以有自己的实例变量和实例方法。

  • 实例方法

           类对象的实例方法,即,类定义中的类方法定义

 

  1. class Test   
  2.    def Test.to_s   
  3.       puts 'This is class method'   
  4.    end  
  5. end  

      等价:

ruby 代码
  1. class Test         
  2.         
  3.   class << self         
  4.      def to_s         
  5.             
  6.         .......         
  7.      end         
  8.   end         
  9. end        
  • 实例变量

           类实例变量是定义在metaclass中的变量。所以,必须在metaclass中定义访问函数。可以通过以下几种方式定义

ruby 代码
  1.   
  2. class Test                                              class Test   
  3. @a='ffd'                                                 @a='ffd'   
  4. end                                                      class <<self  
  5.                                                          attr_reader:a  
  6. class <class << Test       <=>             
  7.                                                          end  
  8.  def a()                                                end            
  9.  @a                    <=>     attr_reader:a  
  10.  end  
  11. end                            end  
  12.   
  13. print Test.a => ffd  

  

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics