Проверка параметра как класса в Squeak Smalltalk

Как я могу проверить параметр как объект класса? Например, если я хочу проверить параметр как строку, я мог бы написать param1 isString. Есть что-то вроде isClass?


person gigman    schedule 16.12.2012    source источник
comment
Вы можете принять ответ или указать, чего не хватает   -  person Tobias    schedule 31.07.2016


Ответы (2)


Как отмечали другие, isKindOf: и isMemberOf: — ваши друзья, когда вы пытаетесь разобраться в подобных вещах, но вызов этих методов обычно — это своего рода запах кода. Почти всегда есть лучшие способы сделать это, которые я разделю на две категории:

  1. Реализуйте метод для всех соответствующих классов, выполняя правильные действия для каждого. Например, если бы я писал видеоигру, то вместо того, чтобы проверять, какой объект я получаю и сообщаю ему что делать дальше, я могу вместо этого просто реализовать функцию performNextStep для всех игровых объектов, а затем предоставить каждому объекту возможность выяснить, что он должен делать.
  2. Тестируйте на функциональность, а не на принадлежность к классу. Вместо того, чтобы проверять, является ли что-то isKindOf: классом, вместо этого проверьте, является ли оно respondsTo: aMethod, и вызовите его, если это так. Это также означает, что классы, получившие действительный метод, но не находящиеся в исходной иерархии, которую вы ожидали, по-прежнему могут передаваться, что вдвойне важно, если вы используете черты, где может не быть единственной иерархии классов для тестирования.
person Benjamin Pollack    schedule 20.12.2012

Вы можете проверить, наследуется ли ваш параметр от 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'
person Leo    schedule 16.12.2012
comment
Если вы хотите охватить случай Class, Metaclass и Trait, у вас также есть сообщение #isBehavior в Squeak.‹br› - person aka.nice; 17.12.2012