Tuesday, October 28, 2008

(3)类方法的可见性,public,protected,private

如果你使用过其它语言,你一定知道public,protected,private是什么,在Ruby中所有的方法,如果没有特殊的限制都是public的,类之外的方法Ruby解析为Object对象的private方法,在Ruby中定义方法的可见范围可以通过下面的方式,即区块方式,凡是protect关键字后下面的都是protect方法,private关键字下面的是private方法,public方法放在最上面没有任何关键字修饰。
class Med
  def pb
    print "Public"
  end
  protected
  def pt1
      print "pt1"
  end
  def pt2
    print "pt2"
  end
  private
  def pv1
    print "pv1"
  end
  def pv2
    print "pv2"
  end
end

m=Med.new
m.pb  #public方法可以执行
m.pt1 #这里你会得到NameError的异常 
m.pt2 #这里你会得到NameError的异常 
m.pv1 #这里你会得到NameError的异常 
m.pv2 #这里你会得到NameError的异常
你还可以把方法名的Symbold当作protected或者private的参数的方式来定义方法的可见性:
class Test
  def pb
    print "Public"
  end
  def pt
    print "Protected"
  end
  def pv
   print "Private"    
  end
  def pv2
    print "Private"    
  end
  protected :pt #通过Symbol的方式定义protected方法
  private :pv,:pv2
end

t=Test.new
t.pb #这里你会得到NameError的异常 
t.pt #这里你会得到NameError的异常 
t.pv #这里你会得到NameError的异常 
t.pv2 #这里你会得到NameError的异常
有时候我们可能希望让一些public的类方法变成private的那么可以通过private_class_method关键字实现,举个例子,有时候我们希望我们的类实现“单态模式”:
class Test
  @@test=nil  #声明一个类变量
  def pb
    print "Public"
  end
  def pt
    print "Protected"
  end
  def pv
   print "Private"    
  end
  def pv2
    print "Private"    
  end
  def Test.create #自定义一个“工厂方法” 实现“单态模式”
     @@test=new unless @@test
     @@test
  end
  protected :pt #通过Symbol的方式定义protected方法
  private :pv,:pv2
  private_class_method :new #将默认的new方法变成private
  
end

t=Test.create #通过自定义方法创建Test对象
t.pb

No comments: