Rosetta Example: Abstract type
-Define a class without instances and without implemented methods. -For detailed description of this example -see http://rosettacode.org/wiki/Abstract_type
package req nx
Define a class AbstractQueue
nx::Class create AbstractQueue { - - :public method enqueue {item} {error "not implemented"} - :public method dequeue {} {error "not implemented"} - - :public object method create {args} { - error "Cannot instantiate abstract class [self]" - } -}
Define a concrete queue (named ListQueue) based -on the Abstract Queue
nx::Class create ListQueue -superclass AbstractQueue { - - :variable list {} - - :public method enqueue {item} { - lappend :list $item - } - - :public method dequeue {} { - set item [lindex ${:list} 0] - set :list [lrange ${:list} 1 end] - return $item - } -}
Demonstrating the behavior in a shell:
-Trying to create an instance of the AbstraceQueue returns an error message:
% AbstractQueue new -Cannot instantiate abstract class ::AbstractQueue
Create an instance of the concrete queue:
% set q [ListQueue new]
Enqueue and dequeue items
% $q enqueue 100 -100 -% $q enqueue 101 -100 101 -% $q dequeue -100