8

JavaやC++などの言語では、コンストラクターにパラメーターを指定します。

Pharo Smalltalkでこれをどのように行いますか?

こんなもの欲しい

|aColor|
aColor = Color new 'red'.

または、これは悪い習慣であり、私は常に行う必要があります

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

2 に答える 2

12

簡単に言えば、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

于 2013-01-08T22:14:00.377 に答える
3

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'.
于 2013-01-08T22:03:30.680 に答える