Index: doc/example-scripts/rosetta-abstract-type.html =================================================================== diff -u --- doc/example-scripts/rosetta-abstract-type.html (revision 0) +++ doc/example-scripts/rosetta-abstract-type.html (revision cd53d89c8bb4d5c622bc56fef18351813c10fdc3) @@ -0,0 +1,825 @@ + + + + + +Listing of doc/example-scripts/rosetta-abstract-type.tcl + + + + + +
+
+

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

+ + + Index: doc/example-scripts/rosetta-abstract-type.tcl =================================================================== diff -u --- doc/example-scripts/rosetta-abstract-type.tcl (revision 0) +++ doc/example-scripts/rosetta-abstract-type.tcl (revision cd53d89c8bb4d5c622bc56fef18351813c10fdc3) @@ -0,0 +1,43 @@ +# +# == Rosetta Example: Abstract type +# For details see http://rosettacode.org/wiki/Abstract_type +# +package req nx +package req nx::test + +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]} "::nsf::__#1" + +# Enqueue and dequeue items +? {$q enqueue 100} 100 +? {$q enqueue 101} "100 101" +? {$q dequeue} 100 \ No newline at end of file