[英]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.