2013-09-21 6 views
0

Есть ли способ определить тип данных уже инициализированной переменной в smalltalk?Smalltalk - Есть ли способ определить тип данных?

Например:

|abc| 
abc := #(1 2 3 4 5 6) 'This is the array declared' 
(abc isKindOf: Array) ifTrue: [ 'Check the data type of abc against array datatype' 
    ^'Success!' 
] 

Причина запроса: мне нужно реализовать метод, только если он вызывается с помощью определенного типа данных.

+3

Можете ли вы немного расширить свой пример? Явные проверки типов часто являются признаком проблемы с дизайном. – Tobias

+0

Тобиас, спасибо за предложение. Это действительно проблема дизайна. Мне просто нужно было добавить метод в класс Array. –

ответ

3

Если я правильно понимаю ваш вопрос, вы можете использовать

abc isMemberOf: Array 

или

abc class == Array 

Проверяется, если abc является экземпляром класса Array (вещь, которую вы называете тип данных).

Также возможно

abc respondsTo: #message 

может быть полезным для вас, как он проверяет, является ли метод, называемый сообщение определяется для abc.

+0

Это было полезно для определения типа данных/класса переменной. Но я понял, что если метод добавлен в класс массива, то сможет вызвать его только экземпляр класса array [который всегда будет массивом]. –

+0

@AdityaKappagantula no. Вы всегда можете использовать 'Array someMessage' где угодно – Uko

1

Просто добавьте метод в массив типов данных. i.e в класс Array.

Тогда только экземпляр массива сможет его назвать.

2

Существует также частая идиома в Smalltalk. Определите метод isArray на Object, который возвращает false; define isArray по классу Array, который возвращает true. Таким образом, вы можете отправить #isArray на любой объект. Но опять же, как сказано выше, эта идиома подчеркивает субоптимальный дизайн.

Смежные вопросы