Smalltalk Vs java中的实例变量

时间:2014-03-29 15:44:24

标签: 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();
}

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

3 个答案:

答案 0 :(得分:6)

  

我认为Java或c#等其他语言也很常见。类的实例无法访问同一个类的另一个实例的实例变量。它仅针对smalltalk具体如何?

很抱歉,但这种想法不正确。

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

对于包含两个字段Pointx的班级yequals方法的常见实现(实际上由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;
}

在此,当前对象直接访问另一个对象point的字段,这在Smalltalk中是不允许的。

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

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

答案 1 :(得分:2)

看一下这个Java代码:

public class Person {
    Integer wallet = new Integer(100);
}

并运行Thief类:

public class Thief {
    Person victim = new Person();

    public static void main (String[] args) {
        Thief thief = new Thief();
        System.out.println("I take $"+ thief.victim.wallet + " from your wallet!");
    }
}

结果是:我从你的钱包里拿走了100美元!

它甚至不必是同一个类的实例。

如果您将Java变量声明为 private ,则同一类的实例仍然可以访问彼此的实例变量。如果你适应上面的例子,小偷仍然可以从另一个小偷那里窃取:

public class Thief {
    private Integer wallet = new Integer(100);

    public Thief victim() {
        Thief victim = new Thief();
        return victim;
    }

    public static void main (String[] args) {
        Thief thief = new Thief();
        System.out.println("I take $"+ thief.victim().wallet + " from your wallet!");
    }
}

这在Smalltalk中是不可能的。

答案 2 :(得分:0)

  

这与Java和C ++形成对比,Java和C ++允许实例变量被恰好属于相同类的任何其他实例访问。

这是真的。