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
インスタンス変数とそのセッターがあると仮定すると、#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
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'.