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