Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

XOTcl abstract instproc

1 view
Skip to first unread message

Manfred Stelzhammer

unread,
Nov 10, 2005, 6:21:36 PM11/10/05
to
Hi

What's wrong in this script1, or do I understand "abstract instproc" wrong?

## script1 start

package require XOTcl
namespace import xotcl::*
package require tclodbc

label .lab -textvariable ::myvar
pack .lab

Class Storage
Storage abstract instproc database {obj dbname}
Storage abstract instproc dbc {command}

Storage instproc opendb {} {
my database dbc plog
}
Storage instproc getdata {} {
set ::myvar [my dbc "select * from adresse"]
}

Storage st
st opendb
st getdata

## script1 end

I get no data in variable ::myvar but ther are some data in the database

If I use script2, there are data in ::myvar.

## script2 start

package require XOTcl
namespace import xotcl::*
package require tclodbc

label .lab -textvariable ::myvar
pack .lab


Class Storage
Storage instproc opendb {} {
database dbc plog
}
Storage instproc getdata {} {
set ::myvar [dbc "select * from adresse"]
}

Storage st
st opendb
st getdata

## script2 end


I use firebird via tclodbc

Regards

Manfred

Artur

unread,
Nov 11, 2005, 2:36:00 AM11/11/05
to
> Storage instproc getdata {} {
> set ::myvar [my dbc "select * from adresse"]
> }

I suppose you want to assign a instance variable but in
this case ::myvar means global variable in :: namespace
the same as

Storage instproc getdata {} {
global myvar


set myvar [my dbc "select * from adresse"]
}

To access instance variable you must either
bind it with "instvar" or use object accessor (which can be slower than
1. option)


Storage instproc getdata {} {
my instvar myvar


set myvar [my dbc "select * from adresse"]
}

Storage instproc getdata {} {
my set myvar [my dbc "select * from adresse"]
}

Or define myvar as parameter

Starage parameter myvar
Storage instproc getdata {} {
my myvar [my dbc "select * from adresse"]
}

abstract methods are a macro trick trick and mostly documentation
issue.
How it works

% Class Foo
::Foo
% Foo abstract instproc database {obj dbname}
% Foo info instbody database

if {[::xotcl::self callingproc] != [::xotcl::self proc] &&
[::xotcl::self callingobject] != [::xotcl::self]} {
error "Abstract method database obj dbname called"} else
{::xotcl::next}

so it define a normal method that cause error if it is called directly.
In some another dynamic OO languages one often write it such way

Foo instproc database {obj dbname} {
error "should be implemented"
}

but abstract variant suspend a errror if a method is called per "next"
from derived object

About DB wrappers. check XOSql
http://www.xdobry.de/xosql
that is XOTcl framework for database addapters (tclodbc is also
supported)

Artur Trzewik

0 new messages