I tried to find a way to simulate inheritance in snit. I've found a way using snit macros
Does anybody have more ideas on this ?
The drawback is we could not add extra specific code in typeconstructor of Kangaroo Type (typeconstructor is already defined in ::Animal_inherit_macro !) ...
This is a short example :
package require snit proc snitDefineInheritMacro {snitType} { set component [string tolower $snitType]_component uplevel " snit::macro ::${snitType}_inherit_macro \{\} \{ typevariable ${snitType}_install_component component ${component} -inherit true delegate option * to ${component} delegate method * to ${component} typeconstructor \{ set ${snitType}_install_component \{install ${component} using $snitType %AUTO%\} \} destructor \{ catch \{${component} destroy\} \} \} " } proc snitCheckMandatoryOptions {args mandatoryOptions} { array set A $args foreach op $mandatoryOptions { if {![info exists A($op)]} { error "Mandatory option $op" } } } ::snit::type Animal { option -name option -species option -weigth "undefined" option -life_time "undefined" constructor {args} { $self configurelist $args } typemethod get:mandatoryOptions {} { return "-species -name" } method get:info {} { puts "I'm a $options(-species). My name is $options(-name)" } } # Define snit macro for Types that will "inherit" from Animal snitDefineInheritMacro Animal #Kangaroo "inherit" from Animal #In fact , kangaroo objects have a Animal component #witch is use to delagate all Animal options/methods to ... ::snit::type Kangaroo { option -jump_length #Call macro generated by : 'snitDefineInheritMacro Animal' line ::Animal_inherit_macro constructor {args} { #install Animal component : $animal_component eval $Animal_install_component $self configurelist $args #Control mandatory options snitCheckMandatoryOptions $args [concat [Animal get:mandatoryOptions] \ [list -jump_length]] } method get:info {} { puts "[$animal_component get:info] I'm jumping $options(-jump_length) feets !" } }
Now we can build jumpy kangoo object :
%>Kangaroo %AUTO% -jump_length 100 -name "jumpy kangoo" -species "mammiferes"
::Kangaroo1
%> ::Kangaroo1 cget -species
mammiferes
%>::Kangaroo1 cget -jump_length
100
%>::Kangaroo1 get:info
I'm a mammiferes. My name is jumpy kangoo I'm jumping 100 feets !
Is there a SNIT guru to confront this to what is explain in snitfaq overview? [L1 ]: Note that you can achieve the effect of inheritance using COMPONENTS and DELEGATION--and you can inherit from anything that looks like a Tcl object.
I mean: Can a SNIT guru give us the code to achieve the effect of inheritance as explain in snitfaq using same example of this kangaroo?
RFox Well think adding inheritance to Snit sort of makes it not Snit myself. Snit is intentionally a component/composition based system.