Как я могу проверить параметр как объект класса? Например, если я хочу проверить параметр как строку, я мог бы написать param1 isString
. Есть что-то вроде isClass
?
Проверка параметра как класса в Squeak Smalltalk
comment
Вы можете принять ответ или указать, чего не хватает
- person Tobias   schedule 31.07.2016
Ответы (2)
Как отмечали другие, isKindOf:
и isMemberOf:
— ваши друзья, когда вы пытаетесь разобраться в подобных вещах, но вызов этих методов обычно — это своего рода запах кода. Почти всегда есть лучшие способы сделать это, которые я разделю на две категории:
- Реализуйте метод для всех соответствующих классов, выполняя правильные действия для каждого. Например, если бы я писал видеоигру, то вместо того, чтобы проверять, какой объект я получаю и сообщаю ему что делать дальше, я могу вместо этого просто реализовать функцию
performNextStep
для всех игровых объектов, а затем предоставить каждому объекту возможность выяснить, что он должен делать. - Тестируйте на функциональность, а не на принадлежность к классу. Вместо того, чтобы проверять, является ли что-то
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
Если вы хотите охватить случай Class, Metaclass и Trait, у вас также есть сообщение #isBehavior в Squeak.‹br›
- person aka.nice; 17.12.2012