2013-01-08 30 views
8

JavaやC++のような言語では、コンストラクタにパラメータを与えます。スモールトーク初期化変数

Pharo Smalltalkでこれをどうやってやっていますか?

私は

|aColor| 
aColor = Color new 'red'. 

のような何かをしたいか、この悪い習慣だと私は常にすべてのメンバフィールドは、Smalltalkので

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

答えて

12

sあなたがスモールトークでも同じことをすることができるということです。呼び出し元のコードから、それは次のようになります。

aColor := Color named: 'Red'. 

長い答えはSmalltalkの中で、あなたが少なくともないあなたは、クラスにちなんで名付けられた特別なメッセージを持っているという意味で、コンストラクタを持っていないということです。 Smalltalkで行うことは、インスタンスをインスタンス化して構成できる、クラス側のメッセージ(インスタンス[*]ではなくクラスによって理解されるメッセージ)を定義することです。あなたのColorクラスがnameインスタンス変数とそのためのセッターを持っていると仮定すると、#named:方法は次のように実施される:

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

には、いくつかの注意事項:我々はに送信された#newメッセージを使用している

  • クラスは新しいインスタンスを作成します。 #newメッセージをオブジェクトを作成するための基本的な方法と考えることができます(ヒント:#newメッセージの実装者をブラウズして実装方法を確認できます)。
  • 新しい「設定済み」インスタンス(例:Color fromHexa:)を作成するか、事前に作成したインスタンス(たとえばColor blue)を返すような数のクラスメソッドを定義できます。
  • Color newを実行して、未初期化インスタンスを作成することはできます。その動作を禁止する場合は、#newクラスメッセージを上書きする必要があります。

あなたはStef's Free Online Smalltalk Books

でSmalltalkの基本について読むことができ、多くの良書があります(クラスを含む)すべてが対象であるため、[*]これは、Smalltalkの上の直交性のために、非常に自然です。興味のある方は、Pharo by Exampleの第13章や、Smalltalkのクラスとメタクラスのリファレンスを参照してください。

HTH

+1

さらに良いことには、任意のセッターを有する、必要に応じてパラメータ化単一の初期化方法ではない: 'カラー>> #initializeWithName:'この場合です。 –

+1

少し明確にするために、クラスはオブジェクトであり、インスタンスは別のオブジェクトです。カプセル化を尊重するために、クラスはインスタンスのインスタンス変数へのアクセス権を持ちません。 Smalltalkはメッセージを送信していますが、このような基本的なカーネルタスクであっても... FrankShearar氏によると、一度にすべての変数を設定する単一のメッセージをインスタントサイドに置く方が良いかもしれません。 –

+0

FrankShearar&aka.nice、答えを改善してくれてありがとう –

3

を行う必要がありますが、厳密にプライベートであり、それらに割り当てるあなたがする必要があります割り当て方法を定義する。

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'.