JavaやC++のような言語では、コンストラクタにパラメータを与えます。スモールトーク初期化変数
Pharo Smalltalkでこれをどうやってやっていますか?
私は
|aColor|
aColor = Color new 'red'.
のような何かをしたいか、この悪い習慣だと私は常にすべてのメンバフィールドは、Smalltalkので
|aColor|
aColor = Color new.
aColor name:= red.d
JavaやC++のような言語では、コンストラクタにパラメータを与えます。スモールトーク初期化変数
Pharo Smalltalkでこれをどうやってやっていますか?
私は
|aColor|
aColor = Color new 'red'.
のような何かをしたいか、この悪い習慣だと私は常にすべてのメンバフィールドは、Smalltalkので
|aColor|
aColor = Color new.
aColor name:= red.d
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
を行う必要がありますが、厳密にプライベートであり、それらに割り当てるあなたがする必要があります割り当て方法を定義する。
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'.
さらに良いことには、任意のセッターを有する、必要に応じてパラメータ化単一の初期化方法ではない: 'カラー>> #initializeWithName:'この場合です。 –
少し明確にするために、クラスはオブジェクトであり、インスタンスは別のオブジェクトです。カプセル化を尊重するために、クラスはインスタンスのインスタンス変数へのアクセス権を持ちません。 Smalltalkはメッセージを送信していますが、このような基本的なカーネルタスクであっても... FrankShearar氏によると、一度にすべての変数を設定する単一のメッセージをインスタントサイドに置く方が良いかもしれません。 –
FrankShearar&aka.nice、答えを改善してくれてありがとう –