2009-12-28 74 views
4

是否有任何OOP语言中的对象私有的概念?我的意思是比经典的专用访问更具限制性?object-private Vs class-private

Private (or class-private) restricts the access to the class itself. Only methods that are part of the same class can access private members.

对象私有:限制访问对象本身。只有方法的对象可以访问的成员,这将是不可能写:

public class Person { 

private String secret; 
public String othersSecret; 

public void snoop(Person p) { 
    othersSecret = p.secret; //will be prohibited by the compiler 
} 

编辑:

如果它存在,你可以给我一些例子......如果不是你认为这是有趣的有这种功能?是否有可能在其他OOP语言中模拟它?

编辑2: 感谢你们,所有的答案都非常有启发...

到现在为止,临时结论

instance-private概念在两种语言存在:

1 - Smalltalk经过数小时的谷歌搜索:)我发现这个概念背后的语言!

The state an object holds is always private to that object. Other objects can query or change that state only by sending requests (messages) to the object to do so.

2 - 红宝石感谢洛根

One person summed up the distinctions by saying that in C++, “private” means “private to this class”, while in Ruby it means “private to this instance”. What this means, in C++ from code in class A, you can access any private method for any other object of type A. In Ruby, you can not: you can only access private methods for your instance of object, and not for any other object instance (of class A).

+0

我刚编辑我的文章更清晰......我问理论......在任何OOP语言... – 2009-12-28 17:09:37

+0

让我走的事情之一'吧?'通过C#,AFAIK它只支持类私有。 – 2009-12-28 17:41:30

+0

@Johannes:'class-private'是OOP语言(C#,java ...)处理封装的正常方式...直到现在我只能看到允许'object-private'的Ruby(感谢Logan).. – 2009-12-28 18:31:41

回答

3

在ruby中,每个对象的私有是唯一的私有的(你必须使用protected来获得类的私有行为)。

E.g. foo.rb:

class A 
    private 
    def a=(x) 
      @a=x 
    end 
    public 
    def a 
      @a 
    end 

    def b(c) 
      c.a = 2 
    end 
end 

a1 = A.new 
a2 = A.new 
a1.b(a2) 

运行它,我们得到

foo.rb:12:in `b': private method `a=' called for #<A:0xb7c9b6e0> (NoMethodError) 
    from foo.rb:18 

当然也有解决这个办法,但几乎总是。

+0

非常有趣的例子!我想知道是否有其他语言支持这一点......以及为什么它不是其他语言的OOP语言的标准...... – 2009-12-28 18:23:39

+1

有些种类的OO功能只在某些语言中才会显示。对于一些有趣的例子(例如,多方法,元类和方法组合(例如:before,:after和:around),其中后两个预制的面向方面的编程),参见CLOS。 – outis 2009-12-28 20:46:33

+0

@outis:在CLOS中我最喜欢的是当我们使用call-next-method时,多重继承中的调用的线性化...大到CLOS;) – 2009-12-28 21:04:10

0

我不认为这种阶级的区别VS对象private存在最普遍的语言OO例如C#,C++,Python,Java,Objective-C ......公平地说,我记不起实际上具有此功能的语言。

1

在Java中,它看起来像你正在写的,“私有”意味着类私有。没有办法强制对象私有模式。原因是“私人”是一种强制执行封装,而不是安全

0

是的,您可以在Java中创建包含实例变量的对象,该实例变量的其他实例无法看到。简单的例子:

class Secretive { } 
Secretive s = new Secretive() { 
    int unknowable = 42; 
}; 
Secretive t = new Secretive() { 
    String unfathomable = "banana"; 
}; 
+1

这不完全正确。在你的例子中,你创建了两个新的匿名类,并为每个类创建一个实例。因此,每个实例都可以拥有对其(匿名)类专用的数据,但这与将数据隐藏到实例中并不完全相同。 – 2009-12-28 17:24:11

0
public class Person 
    { 
     private String privateSecret; 
     public String PublicInformation; 

     public void Snoop(Person p) 
     { 
      // will be allowed by the .NET compiler 
      p.PublicInformation = p.privateSecret; 
     } 
    } 

只使用性能,或只读领域执行你安全

你也可以使用内部访问者来欺骗你的班级assambley。

您也可以使用一些拒绝技术,如this one

+0

它也将被允许通过javac和所有oop compiller我知道...我问是否有语言谁提供其他级别的封装,禁止这... – 2009-12-28 17:17:49

+0

@Paolo:这不是“怪异”,这是正常的方式OOP语言处理封装......这就是为什么我问我的问题:) – 2009-12-28 17:25:29

2

我认为你想要的功能可以通过比喻来实现,不允许人员直接沟通。 要以最小的努力达到此目的,您可以引入一个界面,该界面不会提供您想要保密的内容。

public interface IPerson 
{ 
    void communicateFormally(); 
} 

public class Person : IPerson 
{ 
    private String secret; 
    public String othersSecret; 

    public void snoop(IPerson p) { 
     othersSecret = p.secret; //will be prohibited by the compiler 
    } 
    ... 
} 

现在,这可能是由一个丑陋的演员“黑客”,但我认为这是一个黑客的问题。

+0

但这会给我们一个“pivotate-interface”功能......不是像“Logan Capaldo”ruby例子那样的“私人对象”... – 2009-12-28 18:13:18

2
+0

请参阅pdf“对象编程语言中的封装和继承”http://eprints.kfupm.edu.sa/37524/1/37524.pdf – igouy 2009-12-29 19:08:29

+0

请参见“Smalltalk背后的设计原理”http://www.cs.virginia埃杜/〜埃文斯/ cs655 /读数/ Smalltalk的。html – igouy 2009-12-29 19:09:29

+0

@igouy:thx文章... – 2009-12-29 20:44:52

相关问题