Как вы устанавливаете класс объекта на что-то еще? - PullRequest
2 голосов
/ 03 декабря 2009

Я видел это недавно и теперь не могу найти ...

Как установить класс объекта на что-то еще?

- Обновление: ну в Pharo! Нравится:

d:=Object new. d setClass: Dictionary.

Только то, что на самом деле это не setClass. Как вы можете изменить указатель класса объекта?

Ответы [ 4 ]

2 голосов
/ 12 декабря 2009

Есть #primitiveChangeClassTo:.

Требуется, чтобы исходный и целевой класс имели одинаковое расположение классов. По какой-то странной причине он ожидает экземпляр целевого класса в качестве параметра, который, однако, не используется.

Так вы бы сделали

d := Object new.
d primitiveChangeClassTo: Dictionary new.

однако это терпит неудачу, так как в словарях есть две переменные экземпляра, а в простых объектах их нет.

Если вы занимаетесь метапрограммированием, вам также может быть интересно использовать любой объект в качестве класса. Я использовал это в Protalk , чтобы реализовать язык на основе прототипов, который работает непосредственно поверх Smalltalk.

0 голосов
/ 22 января 2010

Посмотрите на Class ClassBuilder. Он создает новый класс, когда вы модифицируете класс, а затем переключает экземпляры первого на экземпляры последнего. Для этого он должен предоставить какой-то метод, который делает то, что вы просите.

0 голосов
/ 11 декабря 2009

хорошо, тогда вы можете попробовать что-то как:

d := Object new.
e := Dictionary new.

d become: e. 

Но, пожалуйста, попробуйте #become: с осторожностью, потому что во многих ситуациях это портит изображение.

0 голосов
/ 04 декабря 2009

Метод #setClass: используется в некоторых конкретных контекстах и ​​в разных реализациях (проверьте его с помощью метода поиска методов).

У объекта есть несколько помощников для преобразования текущего объекта в другой вид, например, #asOrderedCollection, потому что это последнее разрешает операцию:

asOrderedCollection
    "Answer an OrderedCollection with the receiver as its only element."

    ^ OrderedCollection with: self

НТН.

...