Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 可从同一类的其他实例访问的私有成员_Oop - Fatal编程技术网

Oop 可从同一类的其他实例访问的私有成员

Oop 可从同一类的其他实例访问的私有成员,oop,Oop,我只是注意到一些我以前从未意识到的事情。事实证明,这个类在C#中是有效的: 因此,同一类的不同实例可以访问彼此的私有成员 到目前为止,我认为对象的私有成员只能由该对象访问,而不能由同一类的其他实例访问。发现这一点有点令人惊讶 在所有通用的面向对象语言中都是这样吗?这不是直觉的。 < P>这与C++和java中的相同:访问控制是按类工作的,不是按每个对象的。 在C++中,java和C语言访问控制是静态的,编译时的特征。这样就不会产生任何运行时开销。只有每类控件才能通过这种方式实现。对于一个不通过公

我只是注意到一些我以前从未意识到的事情。事实证明,这个类在C#中是有效的:

因此,同一类的不同实例可以访问彼此的私有成员

到目前为止,我认为对象的私有成员只能由该对象访问,而不能由同一类的其他实例访问。发现这一点有点令人惊讶


在所有通用的面向对象语言中都是这样吗?这不是直觉的。

< P>这与C++和java中的相同:访问控制是按类工作的,不是按每个对象的。
在C++中,java和C语言访问控制是静态的,编译时的特征。这样就不会产生任何运行时开销。只有每类控件才能通过这种方式实现。

对于一个不通过公共方法公开其所有内部状态的类,您如何为其创建一个副本构造函数

考虑一下这样的情况:

class Car
{
public:
    void accelerate(double desiredVelocity);
    double velocity() const;
private:
    Engine myEngine;
};

Car
的公共接口不公开其
引擎,但您需要它来制作副本。

对于完全相同的场景,Scala中存在“特定于对象的私有”与Java中不支持的“特定于类的私有”

class Foo {

  private[this] def contents // [this] marks the property as private to the owner

  def doFoo(other: Foo) {
    if (other.contents) { // this line won't compile
      // ...
    }
  }

}
这是一个很好的例子 令人惊讶的是,在其他现代语言中不支持这种功能,我理解这可能不是一个安全风险,因为它仍然与类绑定,并且您仍然可以通过反射访问所有私有变量


如果你从Python语言的角度来看,它们甚至没有C#中那么广泛的作用域特性,最终都是关于代码组织的,从语言设计的角度来看,这是一个新手必须经历的学习曲线,结果发现有人已经问了一个非常类似的问题:。不过,这个问题的答案并没有给出这种设计选择的权威性理由。这仅仅是因为做不同的事情效率低/不可能吗?是的;这没有其他合适的方法来创建复制/克隆方法。如果您担心它在程序集外部或其他地方被访问,则可以将其设置为内部保护。这也是实现equals()所必需的。为什么会出现这种情况?除了(隐式或显式)
this
引用之外,编译器不能禁止对任何对象调用私有方法吗?这意味着私有方法不能被调用到其他恰好引用
this
的变量上,但我不认为这有任何缺点。我认为Japreis的回答更正确。非常感谢你的解释!!
class Foo {

  private[this] def contents // [this] marks the property as private to the owner

  def doFoo(other: Foo) {
    if (other.contents) { // this line won't compile
      // ...
    }
  }

}