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

ruby的方法调用作用域

浏览 8387 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-03  
ruby的method作用域和Java一样,修饰词都有private,protected和public。其中public的含义都是一样的,但是private和protected却完全不一样。这一点在《Programming ruby》当中语焉不详。今天看了《ruby for rails》第7章才搞明白了。

一、Java当中的含义:
private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用,例如:

package com.javaeye;

public class C {

    private String name;
	
    private String getName() {
        return name;
    }
	
    public C(String name) {
        this.name = name;
    }
	
    public boolean compare(C c) {
        return this.name == c.getName();
    }
	
}


protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;

二、Ruby当中的含义:
private在当前类以及子类都可以调用,其他类无法访问,比Java宽松一些,但private方法只能被当前对象隐式调用(self.),不能被同一类别的其他对象实例调用,这又比Java严格;

protected稍微宽松一些,可以被同一个类别的其他实例调用,例如:

class C
  def initialize(name)
    @name = name
  end

  def compare(c)
    c.name == @name
  end

  protected
  def name
    @name
  end
end

class D < C
end

d1 = D.new("fankai")
d2 = D.new("hello")

puts d1.compare(d2)


在类别C当中使用c.name,如果name方法是private的话,只能使用self调用,即只能当前对象实例在当前类范围内调用;如果name方法是protected的话,那么可以使用同一类的对象实例显式调用,即可以引用其他对象实例的name方法。

因此private和protected的在ruby当前和Java的定义有很大的区别:

1、在不同对象实例当中的作用域不同
Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;
Ruby当中,private方法不能被同一个类别的其他对象实例调用;

2、在类继承关系当中的作用域不同
ruby当中,不管private还是protected方法,都可以被子类继承;
Java当中,private方法不能被子类继承;

这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。
   发表时间:2007-05-04  
>Java当中,不管private还是protected的方法,
>都可以被同一个类别的其他对象实例调用;
public class C {   
  
    private String name;   
       
    private String getName() {   
        return name;   
    }   
       
    public C(String name) {   
        this.name = name;   
    }   
       
    public boolean compare(C c) {   
        return this.name == c.getName();   
    }   
       
}  

上面的compare方法可以调用private的getName方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.
0 请登录后投票
   发表时间:2007-05-10  
“protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;”
   Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
0 请登录后投票
   发表时间:2007-05-11  
java 代码
 
  1. package test;  
  2.   
  3. public class C {    
  4.   
  5.     public void test(){  
  6.         D d = new D();  
  7.         d.getA();  
  8.     }  
  9. }   
  10. class D{  
  11.   
  12.     private int a=0;  
  13.     private int getA(){  
  14.         return a;  
  15.     }  
  16. }   
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; "这个说法是不妥当的。
0 请登录后投票
   发表时间:2007-05-11  

xvridan 写道:
java 代码
 
  1. package test;  
  2.   
  3. public class C {    
  4.   
  5.     public void test(){  
  6.         D d = new D();  
  7.         d.getA();  
  8.     }  
  9. }   
  10. class D{  
  11.   
  12.     private int a=0;  
  13.     private int getA(){  
  14.         return a;  
  15.     }  
  16. }   
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; "这个说法是不妥当的。



什么叫“D类的对象不对访问D类的private方法”?

d.getA();   就是D类的对象访问D类的“getA”方法?

不理解不要瞎说啊。

0 请登录后投票
   发表时间:2007-05-11  
呵呵,打错了,
D类的对象不能访问D类的private方法,对象也不能访问其蓝图类的私有属性的方法和变量
0 请登录后投票
   发表时间:2007-06-12  
java

		继承		调用

public	      子类均可		均可
protected     子类均可		包内	
default	      包内子类		包内		
private	      均不可		类定义本身	


ruby

		继承		调用

public	      子类均可		均可
protected     子类均可		子类均可	
private	      子类均可		self	


0 请登录后投票
论坛首页 编程语言技术版

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