Next: methods calling, Previous: methods virtual, Up: methods [Contents][Index]
It happens that we want to define virtual methods in a super–type, override them in a sub–type and then forbid further overriding in the sub–types of the sub-type. This is possible with sealing methods.
The clause seal-method allows the definition of methods
associated to a record–type that might override the super–type’s
methods, but that forbid the sub–types from overriding them. For
everything else: sealing methods work like concrete methods.
In the following example everything works as usual, with <sub>
overriding the implementation of doit in <super>:
(define-record-type <super>
(virtual-method (doit)
1))
(define-record-type <sub>
(parent <super>)
(seal-method (doit)
2))
(define (super-fun {O <super>})
(.doit O))
(define (sub-fun {O <sub>})
(.doit O))
(define O
(new <sub>))
(super-fun O) ⇒ 2
(sub-fun O) ⇒ 2
but adding the following definition will cause an expand–time
exception, because sub–types of <sub> are forbidden from having a
method named doit:
(define-record-type <sub-sub>
(parent <sub>)
(method (doit)
3))
error→ &syntax
the following definition will also cause an expand–time exception,
because sub–types of <sub> are forbidden from having a field
named doit:
(define-record-type <sub-sub> (parent <sub>) (fields doit)) error→ &syntax