View · Search · Index
No registered users in community xowiki
in last 10 minutes

Re: [Xotcl] abstract methods

From: Koen Danckaert <koen_at_retarget.com>
Date: Wed, 13 Jul 2005 12:26:34 +0200

Hi Uwe,

This solution indeed produces an error for the case I mentioned before, but now it also gives errors when an abstract method is invoked by "next".
I think that callingproc and callingobject cannot be used to test whether a method has been invoked by next. They are not modified through a next call, as shown by the following code:

Class C
C instproc a {} {
    puts "callingproc : '[self callingproc]'"
    puts "callingobject : '[self callingobject]'"
}

Class D -superclass C
D instproc a {} {next}
D instproc b {} {my a}

D test
test a
test b


This produces:
callingproc: ''
callingobject: ''
callingproc: 'b'
callingobject: '::test'

So it is as if there was no intermediate "next" call.

Koen


Uwe Zdun wrote:
> it seems you've found a bug. The Method in predefined.xotcl should
> probably look like this:
>
> ::xotcl::Object instproc abstract {methtype methname arglist} {
> if {$methtype != "proc" && $methtype != "instproc"} {
> error "invalid method type '$methtype', \
> must be either 'proc' or 'instproc'."
> }
> ::xotcl::my $methtype $methname $arglist "
> if {\[::xotcl::self callingproc\] == \[::xotcl::self proc\] &&
> \[::xotcl::self callingobject\] == \[::xotcl::self\]} {
> ::xotcl::next
> } else {
> error \"Abstract method $methname $arglist called\"
> }
> "
> }