Rebol中的共享功能(实现继承)

时间:2010-01-04 15:18:10

标签: rebol

有人说你可以用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

这是相当蹩脚的,因为我需要重复名称圈两次,而在通常的继承中有这个关键字,它避免了这种无意识的语法。有更优雅的方式吗?

感谢。

3 个答案:

答案 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!

当然,你应该关注绑定问题。希望这会有所帮助。