Совместно используемая функция в Rebol (реализация наследования) - PullRequest
1 голос
/ 04 января 2010

Кто-то сказал, что вы можете иметь (наследование реализации) с 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

, что довольно неубедительно, поскольку мне нужно повторить круг имен дважды, в то время как в обычном наследовании есть ключевое слово this, которое позволяет избежать такого рода неестественного синтаксиса Есть ли более элегантный способ?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 января 2010

Есть слово 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". Но понятие self было захвачено и связано во время определения selfWordAlias, которое находилось в контексте глобальной системы. Так вот, что вы получите обратно.

Существуют инструменты для решения этой проблемы, но убедитесь, что у вас есть надежный контроль над Области применения в Rebol !

1 голос
/ 27 июля 2010

Я использую этот метод, когда хочу использовать одну и ту же функцию (не копии функции) для всех своих объектов. Направляйте функцию всякий раз, когда вы создаете объект, даже если вы копируете другой объект.

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

Конечно, вы должны позаботиться о связующих вопросах. Надеюсь, это поможет.

1 голос
/ 15 января 2010

Я бы подумал, что использование прототипного наследования 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]
]
...