Bee Smalltalk中的实例行为

Bee Smalltalk中的实例行为,smalltalk,bee-smalltalk,Smalltalk,Bee Smalltalk,是否有任何方法可以在不影响其他实例的情况下更改类的特定实例的行为(即,它们仍然根据类的行为进行行为) 例如,我希望实例a的打印方式与下面示例中的实例b不同 假设我有一个类MyClass,它响应name,具有以下打印服务: MyClass>>printOn: aStream aStream nextPutAll: self class; nextPutAll: ' instance named '; nextPutAll: se

是否有任何方法可以在不影响其他实例的情况下更改类的特定实例的行为(即,它们仍然根据类的行为进行行为)

例如,我希望实例
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'

Bee Smalltalk支持特定于实例的行为。这意味着很容易告诉类的任何实例如何响应任何给定的消息

在你的情况下,得到你想要的东西最简单的方法就是评估

b answerTo: #printString with: 'b'
实际上,这将在表示方法的
b
行为中安装一个特定于实例的方法

printString
  ^'b'
printString
  ^b name
但仅绑定到
b
,而不绑定到
MyClass
的其他实例,这些实例仍将使用您定义的
\printOn:
方法

更好的方法不是硬编码
'b'
,而是引用
b name
。为此,您应评估:

b answerTo: #printString evaluating: [b name].
b answerTo: #printString evaluationg: [b name] while: aBlock
这更好,因为如果您重命名
b
使其名称现在为
'b2'
,则
#printString
的前一个实现将继续回答
'b'
,而后者将回答
'b2'
。换句话说,这将安装该方法

printString
  ^'b'
printString
  ^b name
仅适用于
b
(并保持其他实例不变)

最后,如果您希望这种行为是暂时的而不是永久的,您应该评估:

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

其中,
aBlock
表示要执行的代码块,在此期间,您的实例需要将所述特定行为附加到
#printString

“但b和a都是MyClass的实例。这就是他们谈论“实例行为”的原因,因为同一类的实例有不同的行为。而实例特定行为的兴趣在于,例如,在调试时使用它,而不改变其他实例的行为。”@CarlosE.Ferro“但是b和a都是MyClass的实例”当代码是:
b:=Object new name:'b.
,这很难猜测。通过调试,这很有意义-您想更改当前实例的值,看看它意味着什么。我看到您对Bee Smalltalk有深刻的理解:)。祝贺您将其发布到github!()@tukan非常感谢。虽然还没有。几天后会有东西下载。正如你的页面上写的,它仍然没有实际存在,但你正在努力,这仍然是一个好消息。不要着急,最好做一些正确的事情,而不是快速。出于好奇,有没有什么时间表蜜蜂什么时候会出来?我很想尝试w smalltalk:)@tukan是的,技术预览将在一两周内提供。