Rosetta Example: Constrained genericity
For details see http://rosettacode.org/wiki/Constrained_genericity
package req nx
Define the two classes Eatable and Fish. Eatable is a class for all eatable things, a Fish is a subclass ant therefore eatable.
nx::Class create Eatable nx::Class create Fish -superclass Eatable { :property name }
A FoodBax may only contain eatable items. Therefore with we define items as a property of type Eatable" which has a multiplicity of +0..n (might contain 0 to n eatable items). Furthermore, we define items as incremental, such we can add / remove items with item add or item remove.
nx::Class create FoodBox { :property item:object,type=::Eatable,0..n,incremental :public method print {} { set string "Foodbox contains:\n" foreach i ${:item} {append string " [$i name]\n"} return $string } }
Demonstrating the behavior in a shell:
Create two fishes, Wanda and Nemo:
% set f1 [Fish new -name "Wanda"] % set f2 [Fish new -name "Nemo"]
Create a Foodbox and add the two fishes:
% set fb [FoodBox new] % $fb item add $f1 % $fb item add $f2
Return the print string of the contents:
% $fb print
Foodbox contains:
Nemo
Wanda