Smalltalk Vs java中的实例变量

Siv*_*ran 3 java encapsulation smalltalk instance-variables getter-setter

在Pharo by Example Book中,我读到了

Smalltalk中的实例变量对于实例本身是私有的.这与Java和C++形成对比,后者允许实例变量(也称为"字段"或"成员变量")由恰好属于同一类的任何其他实例访问.

我认为它对Java或c#等其他语言也很常见.类的实例无法访问同一个类的另一个实例的实例变量.它仅适用于smalltalk?

在Smalltalk中,同一个类的两个实例不能访问彼此的实例变量,除非该类定义了"访问器方法"

实例如何使用访问器方法访问另一个实例的实例变量?

using namespace std;
#include<iostream>
class car {
  private:
    int mileage;
  public:
    car(int); // Constructor
    int odometer();
};

car::car(int m) {
  mileage = m;
}

int car::odometer() {
  return mileage;
}

int main(void) {
  car ford(10000);
  car honda(20000);

  cout<<ford.odometer(); 
  cout<<honda.odometer();
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,ford和honda是同一类的两个实例Car.福特如何使用本田对象的里程数,反之亦然?这是我的实际问题.对不起,如果这太天真了

Don*_*oby 6

我认为它对Java或c#等其他语言也很常见.类的实例无法访问同一个类的另一个实例的实例变量.它仅适用于smalltalk?

对不起,但这种想法不正确.

在Java中,类的实例可以访问同一个类的另一个实例的私有字段.

一类Point具有两个字段xy,所述的共同的实施equals方法(实际上通过的Intellij生成)为:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Point point = (Point) o;

    if (x != point.x) return false;
    if (y != point.y) return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当前对象point直接访问另一个对象的字段,这在Smalltalk中是不允许的.

在C#和许多其他语言中也允许这样做.Smalltalk是否真的是禁止它的唯一语言我不确定.

按照惯例,Smalltalk类的访问器通常与实例变量相同,但您需要实际编写访问器,并且没有直接访问不同实例上的字段的语法.