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++,其允許通過恰好是相同類的任何其他實例進行訪問的實例變量。

這是真的。