Rosetta Example: Abstract type

package req nx

nx::Class create AbstractQueue {

  :public method enqueue {item} {error "not implemented"}
  :public method dequeue {} {error "not implemented"}

  :public class method create {args} {
    error "Cannot instantiate abstract class [self]"
  }
}

Create a concrete 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