Поведение экземпляра в Bee Smalltalk - PullRequest
0 голосов
/ 13 сентября 2018

Есть ли способ изменить поведение отдельных экземпляров класса, не затрагивая остальные экземпляры (т. Е. Они все еще ведут себя в соответствии с поведением класса)?

Например, я бынапример, экземпляр a имеет способ печати, отличный от экземпляра b в следующем примере.

Предположим, у меня есть класс MyClass, который отвечает на name, сследующий сервис печати:

MyClass>>printOn: aStream
    aStream
        nextPutAll: self class; 
        nextPutAll: ' instance named ';
        nextPutAll: self name`

Тогда, если я создаю экземпляр a, у меня есть следующее:

a := MyClass new name: 'a'.
a printString -> 'MyClass instance named a'

Теперь я хотел бы, чтобы экземпляр b печатал только егоимя не влияет на способ печати a.

b := Object new name: 'b'.
b printString -> 'b'

1 Ответ

0 голосов
/ 14 сентября 2018

Bee Smalltalk поддерживает поведение, характерное для экземпляра.Это означает, что любой экземпляр вашего класса легко сказать, как реагировать на любое сообщение.

В вашем случае, самый простой способ получить то, что вы хотите, - это оценить

b answerTo: #printString with: 'b'
* 1005.* Фактически, это установит специфичный для экземпляра метод в поведении b, представляющем метод
printString
  ^'b'

, но привязанный только к b, а не к другим экземплярам MyClass, который все еще будетиспользуйте метод #printOn:, который вы определили.

Еще лучший подход не заключался бы в жестком коде 'b', а вместо этого ссылался бы на b name.Для этого вы должны оценить:

b answerTo: #printString evaluating: [b name].

Это лучше, потому что если вы переименуете b, так что его имя теперь 'b2', прежняя реализация #printString будет продолжать отвечать 'b', в то время какпоследний ответит 'b2'.Другими словами, это установит метод

printString
  ^b name

только в b (и не затронет другие экземпляры).

Наконец, если вы хотите, чтобы это поведение было временным, а не постояннымВы должны оценить:

b answerTo: #printString evaluationg: [b name] while: aBlock

, где aBlock обозначает блок кода, который вы хотите выполнить и в течение которого вашему экземпляру необходимо привязать указанное специфическое поведение к #printString.

...