0

如何将参数验证为类对象?例如,如果我想将参数验证为字符串,我可以编写param1 isString. 有没有类似的东西isClass

4

2 回答 2

3

正如其他人所指出的那样,当你试图弄清楚这种事情时,他们是你的朋友,但调用这些方法isKindOf:通常一种代码味道。几乎总是有更好的方法来做到这一点,我将分为两类:isMemberOf:

  1. 在所有相关类上实现该方法,对每个类做正确的事情。 例如,如果我正在编写一个视频游戏,那么,与其测试我得到什么类型的对象并告诉它下一步要做什么,我可以只performNextStep在所有游戏对象上实现一个函数,然后将它留给每个游戏对象反对弄清楚它应该做什么。
  2. 测试功能,而不是类成员资格。isKindOf:与其检查某事物是否属于类,不如检查是否它respondsTo: aMethod,如果是则调用它。这也意味着已经获得有效方法但不在您预期的初始层次结构中的类仍然可以传递 - 如果您使用 Traits 则非常重要,因为可能没有单个类层次结构可供测试.
于 2012-12-20T16:48:25.417 回答
2

您可以测试您的参数是否继承自Classor 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 回答