So, you need somehow tell the nested class instance who created it. I've found two ways of solution.
The first one is C# way. You pass outer class instance reference to nested class constructor. This works fine. I do not like this way because you need to modify every constructor in every nested class (CoffeeScript allows you to determine only one constructor for each class, but you can use static methods as constructor; I will tell about this later).
The second one seems to me to be more elegant. You declare variable in outer class that holds the instance. Look:
class ArrayWrapper self = undefined array: undefined constructor: (number) -> self = this @array = new Array number set: (index, value) -> @array[index] = value top: () -> return new Iterator 0 class Iterator index: undefined constructor: (@index) -> next: () -> res = self.array[@index] ++@index if @index == self.array.length then @index = 0 return res prev: () -> res = self.array[@index] --@index if @index == -1 then @index = self.array.length - 1 return resIn this simple example we make a class that allows moving along array elements in both directions and in circle. The nested class is iterator. It gets an access to outer class instance array through
self
variable. Take a look at line 2. Do you see =
instead of :
? self
is not a field of ArrayWrapper
, it is a variable in the same scope as outer class methods and nested class itself. Java and C# do not allow declaring such variables. This variable is then initiated in outer class constructor (line 6) and used in nested class methods (lines 21, 23, 27, 29).Lets test this class:
test = new ArrayWrapper 10 for i in [0..9] test.set i, i*i fromLeftToRight = "Ring of size 10 from left to right 15 times: " it = test.top() for i in [0..14] fromLeftToRight += it.next() + " " console.log fromLeftToRight fromRightToLeft = "Ring of size 10 from right to left 15 times: " it = test.top() for i in [0..14] fromRightToLeft += it.prev() + " " console.log fromRightToLeftThe output is:
Ring of size 10 from left to right 15 times: 0 1 4 9 16 25 36 49 64 81 0 1 4 9 16 Ring of size 10 from right to left 15 times: 0 81 64 49 36 25 16 9 4 1 0 81 64 49 36For now these are two ways of nested classes problem solution. Maybe, you know any others?
To be continued...
No comments:
Post a Comment