在Squeak Smalltalk中将参数验证为类

时间:2012-12-16 17:10:49

标签: smalltalk squeak

如何将参数验证为类对象?例如,如果我想将aparameter验证为字符串,我可以编写param1 isString。是否有类似isClass的内容?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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'