簡體   English   中英

Smalltalk初始化變量

[英]Smalltalk initialization variables

在Java和C ++等語言中,我們為構造函數提供參數。

你是如何在Pharo Smalltalk中做到這一點的?

我想要類似的東西

|aColor|
aColor = Color new 'red'.

或者這是不好的做法,我應該一直這樣做

|aColor|
aColor = Color new.
aColor name:= red.d

簡短的回答是你可以在Smalltalk中做同樣的事情。 從調用代碼看起來像:

aColor := Color named: 'Red'.

答案很長,在Smalltalk中你沒有構造函數,至少在你有一個以類命名的特殊消息的意義上。 你在Smalltalk中所做的是定義類端消息(即類所理解的消息,而不是實例[*]),您可以在其中實例化和配置實例。 假設您的Color類有一個name實例變量和一個setter,它的#named:方法將實現如下:

(class) Color>>named: aName
| color |
color := self new.
color name: aName.
^color.

有些事情需要注意:

  • 我們使用發送給類的#new消息來創建新實例。 您可以將#new消息視為創建對象的基本方式(提示:您可以瀏覽#new消息的實現者以查看它是如何實現的)。
  • 我們可以定義盡可能多的類方法,因為我們想要創建新的“已配置”實例(例如Color fromHexa:或返回預先創建的實例(例如Color blue )。
  • 您仍然可以通過執行Color new來創建未初始化的實例。 如果您想禁止該行為,則必須覆蓋#new類消息。

Stef的免費在線Smalltalk書籍中 ,您可以閱讀許多關於Smalltalk基礎知識的好書

[*]由於Smalltalk的正交性,這是很自然的,因為所有(包括類)都是一個對象。 如果您有興趣,請查看Pharo by Example的第13章或Smalltalk中對類和元類的任何其他引用。

HTH

在Smalltalk中,所有成員字段都是嚴格私有的,要分配給它們,您必須定義分配方法。

Color >> name: aString
  name := aString

然后你可以像這樣創建你的對象:

|aColor|
aColor := (Color new)
  name: 'red';
  yourself.

通常使用降低冗長的工廠方法:

Color class >> withName: aName
  ^ (self new)
    name: aName;
    yourself.

有了這個你可以創建這樣的新對象:

|aColor|
aColor := Color withName: 'red'.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM