Index: doc/example-scripts/rosetta-abstract-type.html =================================================================== diff -u -r93bb0947d582f274afb1cdbc885909d55e100b36 -r24cb8f4bffd49c9375c1c64aa0610933b62511bb --- doc/example-scripts/rosetta-abstract-type.html (.../rosetta-abstract-type.html) (revision 93bb0947d582f274afb1cdbc885909d55e100b36) +++ doc/example-scripts/rosetta-abstract-type.html (.../rosetta-abstract-type.html) (revision 24cb8f4bffd49c9375c1c64aa0610933b62511bb) @@ -3,7 +3,7 @@ - + Listing of doc/example-scripts/rosetta-abstract-type.tcl +
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