在任何OOP语言中是否存在 object-private 的概念?我的意思是比经典的私人访问更具限制性?
object-private:限制对对象本身的访问。只有可以访问成员的方法对象才能编写:
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概念以2种语言存在:
经过数小时的谷歌搜索后,1 - Smalltalk :)我找到了这个概念背后的语言!!
2 - Ruby ,感谢 Logan :
答案 0 :(得分:3)
在ruby中,per-object private是唯一的私有(你必须使用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
当然有很多方法可以解决这个问题,但几乎总是存在。
答案 1 :(得分: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
}
...
}
现在,这可能被一个丑陋的演员“黑客攻击”,但我认为这是黑客攻击的问题。
答案 2 :(得分:2)
经过数小时的谷歌搜索:)我找到了这个概念背后的语言: Smalltalk
答案 3 :(得分:1)
在Java中,您正在编写的内容,“私有”意味着类私有。没有办法强制对象私有模式。原因是“私有”是一种强制执行封装的方式,而不是安全。
答案 4 :(得分:0)
我不认为类和对象private
的这种区别对于最常见的语言OO存在,例如C#,C ++,Python,Java,Objective-C ......为了公平我可以'记住一种实际上具有此功能的语言。
答案 5 :(得分:0)
是的,您可以在Java中创建包含该接口的其他实例无法看到的实例变量的对象。琐碎的例子:
class Secretive { }
Secretive s = new Secretive() {
int unknowable = 42;
};
Secretive t = new Secretive() {
String unfathomable = "banana";
};
答案 6 :(得分: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;
}
}
只需使用属性或 readonly 字段来强制执行安全性。
您还可以使用内部访问者在课堂上封装您的课程。
你也可以使用一些Deny技术,如this one。