是否有基于对象访问级别的语言?

Car*_*ter 7 language-agnostic access-levels

关于Java,C#,C++和PHP中的访问级别的一个常见误解是它适用于对象而不是类.也就是说,(比方说)X类的对象无法看到另一个X的私有成员.实际上,当然,访问级别是基于类的,一个X对象可以毫不费力地引用另一个的私有成员.

是否存在具有基于对象的访问级别的语言?它们是代替基于类的访问还是除了基于类的访问?这个功能对程序设计有什么影响?

Ion*_*tan 6

Ruby具有基于对象的访问级别.这是Ruby编程的引用:

"受保护"和"私有"之间的区别相当微妙,并且在Ruby中与大多数常见的OO语言不同.如果方法受到保护,则可以由定义类或其子类的任何实例调用它.如果方法是私有的,则只能在调用对象的上下文中调用它 - 它永远不可能直接访问另一个对象的私有方法,即使该对象与调用者属于同一个类.

以下是来源:http://whytheluckystiff.net/ruby/pickaxe/html/tut_classes.html#S4

Java和Ruby之间的示例区别

Java的

public class Main {
    public static void main(String[] args) {
        Main.A a1 = new A();
        Main.A a2 = new A();

        System.out.println(a1.foo(a2));
    }

    static class A
    {
        public String foo(A other_a)
        {
            return other_a.bar();
        }

        private String bar()
        {
            return "bar is private";
        }
    }
}

// Outputs
// "bar is private"
Run Code Online (Sandbox Code Playgroud)

红宝石

class A
  def foo other_a
    other_a.bar
  end

  private
  def bar
    "bar is private"
  end
end

a1 = A.new
a2 = A.new

puts a1.foo(a2)

# outputs something like
# in `foo': private method `bar' called for #<A:0x2ce9f44> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)