3

在菲罗通过示例图书,我读了Smalltalk的实例变量和Java

实例变量是私有的实例本身。 这与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(); 
} 

在这个例子中福特和本田是同一类Car的两个实例。 福特如何使用本田物件的里程或反之亦然?这是我的实际问题。对不起,如果这是如此天真

+0

我读过答案,并进一步在Pharo By示例书中。我开始明白,在C++和Java中,一个实例可以根据访问修饰符级别访问其他实例的实例变量,如果是私有的,则可以在类中访问它,如果是公共的,则可以在任何地方访问它。但是在Smalltalk中,我们无法在课堂或任何地方进行。由java,C++提供的最大封装仅限于类级别 –

回答

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; 
} 

在此,当前的对象被访问的字段直接使用其他对象point,这在Smalltalk中是不允许的。

这也允许在C#和许多其他语言。无论Smalltalk是否是唯一的语言,我不确定。

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

2

在这个Java代码看一看:

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

和运行小偷类:

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是不可能的。

+0

如果我们在java中声明钱包为private,那么我们可以实现与在smalltalk中一样的事情。不是吗?所以在这本书中,他们说Smalltalk实例变量的范围默认是私有的。我对么 ? –

+1

在这种情况下,小偷只能从另一个小偷那里偷窃:)现在适用_same class_条件。 – MartinW

+1

@Sankaran不,你不能在Java中声明这种方式,同一类的其他实例(或通过桥接方法的内部类)可以访问你的实例的私有字段/方法。例如在Scala中,有一个'private [this]'(Smalltalk方式)和'private'(Java方式)的区别。 –

0

这是相对于Java和C++,其允许通过恰好是相同类的任何其他实例进行访问的实例变量。

这是真的。