有人说你可以用Rebol(实现继承)使用get。所以我试过了:
shape: context [
x: 0
y: 0
draw: func['object][
probe get object
]
]
circle: make shape [
radius: 10
draw: get in shape 'draw
]
rectangle: make shape [
draw: get in shape 'draw
]
我想通过引用而不是通过值传递对象,所以我只使用'Object传递名称。但是我必须这样称呼它
circle/draw 'circle
这是相当蹩脚的,因为我需要重复名称圈两次,而在通常的继承中有这个关键字,它避免了这种无意识的语法。有更优雅的方式吗?
感谢。
答案 0 :(得分:2)
有self
字。冒着对此产生虚假的确定感的风险,我会给你一个可能做你想做的事的例子:
shape: make object! [
x: 0
y: 0
draw: func [object [object!]] [
probe object
]
]
circle: make shape [
radius: 10
draw: func [] [
shape/draw self
]
]
rectangle: make shape [
draw: func [] [
shape/draw self
]
]
这里我们通过使用适当的“self”
调用基类函数来创建零参数的函数小心:就像其他词一样,它会受到约束......而且绑定也会受到限制。一旦你开始使用抽象,这可能会变得棘手......
selfWordAlias: func [] [
return 'self
]
triangle: make shape [
draw: func [] [
shape/draw get selfWordAlias
]
]
致电triangle/draw
可能会让您感到惊讶。你在对象方法中,selfWordAlias返回单词“self”。但是,在定义了selfWordAlias时, self 的概念被捕获并绑定,这是在全局系统环境中。这就是你得到的回报。
有一些工具可以解决这个问题,但要确保你牢牢抓住Scoping in Rebol!
答案 1 :(得分:1)
我原以为使用Rebol的原型继承就是你所需要的。它更简单,更优雅:
shape: make object!
x: 0
y: 0
draw: func [] [probe self]
]
circle: make shape [
radius: 10
]
triangle: make shape []
其中给出以下结果:
>> shape/draw
make object! [
x: 0
y: 0
draw: func [][probe self]
]
>> circle/draw
make object! [
x: 0
y: 0
draw: func [][probe self]
radius: 10
]
>> triangle/draw
make object! [
x: 0
y: 0
draw: func [][probe self]
]
答案 2 :(得分:1)
当我想为所有对象使用相同的函数(而不是函数的副本)时,我使用此方法。 无论何时创建对象,都要指向该函数,即使您复制了另一个对象。
>> f: does [print "hello"]
>> o: context [a: 1 b: :f]
>> o/b
hello
>> p: context [a: 2 b: :f]
>> p/b
hello
>> same? get in o 'b get in p 'b
== true ;they are exactly the same function
>> append last second :f " world!" ;change the function
== "hello world!"
>> o/b
hello world!
>> p/b
hello world!
当然,你应该关注绑定问题。希望这会有所帮助。