0

パラメータをクラス オブジェクトとして検証するにはどうすればよいですか? たとえば、パラメータを文字列として検証したい場合は、 と書くことができますparam1 isString。のようなものはありisClassますか?

4

2 に答える 2

3

他の人が指摘しているisKindOf:ようisMemberOf:に、この種のことを理解しようとしているときはあなたの友達ですが、これらのメソッドを呼び出すことは通常、一種のコードの匂いです。これを行うには、ほとんどの場合、より良い方法があります。これを 2 つのカテゴリに分類します。

  1. 関連するすべてのクラスにメソッドを実装し、それぞれで正しいことを行います。 たとえば、私がビデオゲームを書いている場合、取得しているオブジェクトの種類をテストして次に何をすべきかを伝えるのではなく、代わりperformNextStepにすべてのゲームオブジェクトに関数を実装してから、それぞれに任せることができますそれが何をすべきかを理解するためのオブジェクト。
  2. クラス メンバーシップではなく、機能をテストします。何かisKindOf:がクラスであるかどうかをチェックするのではなく、それがクラスであるかどうかをチェックし、クラスでrespondsTo: aMethodある場合はそれを呼び出します。これはまた、有効なメソッドを取得したものの、期待していた最初の階層に含まれていないクラスを引き続き渡すことができることを意味します。これは、テストする単一のクラス階層がない可能性がある Traits を使用している場合に二重に重要です。 .
于 2012-12-20T16:48:25.417 に答える
2

パラメータがClassまたはから継承されているかどうかをテストできMetaclassます。

String isKindOf: Class orOf: Metaclass => true
"If you don't want Metaclasses, simply use isKindOf: Class"
String class isKindOf: Class orOf: Metaclass => true
'foo' isKindOf: Class orOf: Metaclass => false

ただし、実際に入力を検証せずにClass実行できるように、実行する操作 (およびその他の関連オブジェクト) 自体を実装する方が望ましい場合があります。someOp


入力が文字列で、対応する名前のクラスを取得したい場合 (存在する場合)、次を使用できます。

Smalltalk classNamed: 'String'
于 2012-12-16T17:24:18.507 に答える