Inherited-field vs init-field

时间:2014-12-09 02:45:25

标签: inheritance scheme racket

我正在研究一个项目,我已经有了一些工作程序,但是我遇到了其中一个的初始化变量。

(define red-de-flujo%
  (class grafo%
    (init-field nodof nodod)
    (inherit-field N A)

    (super-make-object)
    (let ([Ninfo (map (λ (n) (send n get-info)) N)])
    (cond
      ((or (not (in? (send nodof get-info) Ninfo)) (not (in? (send nodod get-info) Ninfo))) (error "nodos fuera de N"))
      (else (void))
      )
      )
    (inherit get-nodos get-aristas)
    (define/public (get-nodo-fuente) nodof)
    (define/public (get-nodo-destino) nodod)
    )
  )

这段代码可行,但我使用另一种方法make-object类型red-de-flujo%。这是一段代码:

(define/public
      (crear-red-de-flujo N A nf nd)
      (make-object red-de-flujo% nf nd N A ) <<-- not as in definition
      )

流量网络(red-de-flujo%)由一组节点,一组边和两个分离的节点定义。

我的问题是:有没有办法将继承字段放在init-fields之上?写red-de-flujo%的方式(使用继承)迫使我先发送init-fields,最后发送inherited-fields。我希望能够做到这样的事情:(make-object red-de-flujo% N A nf nd)而不会失去继承。

我已经尝试更改代码中的语句顺序,但它是一样的。

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您不能更改make-object的继承初始化参数顺序,但您可以通过仅使用命名初始化参数(通过newinstantiate)来解决此问题得到你想要的任何订单:

(new red-de-flujo% [N N0] [A A0] [nf nf0] [nd nd0])

其中N0A0等只是我为您要传入的实际值而设置的占位符。

(注意:我原本在这里有更长的解释,但我认为这是错误的,所以我删除了它)