1 | |
---|
2 | Class @Element; |
---|
3 | Class @_Container; |
---|
4 | |
---|
5 | // Para evitar los problemas de referencias cíclicas |
---|
6 | // que se deben a decompilar naturalmente un objeto que contiene |
---|
7 | // referencias a sí mismo, se utiliza una clase intermediaria que |
---|
8 | // se encarga de eliminar las referencias cíclicas antes de destruirlo. |
---|
9 | |
---|
10 | // @Container será la clase intermediaria que además puede ofrecer al usuario |
---|
11 | // una interfaz (apariencia) similar a la clase-núcleo (@_Container). |
---|
12 | // Ésta contiene una instancia de la clase-núcleo y los métodos y atributos |
---|
13 | // para ofrecer la misma apariencia y mecanismos que antes. |
---|
14 | // Además incluye un método destructor que desarma las refencias cíclicas |
---|
15 | // antes de la decompilación de la instancia-núcleo. |
---|
16 | |
---|
17 | Class @Container { |
---|
18 | @_Container _container = @_Container _container; |
---|
19 | Set _.elements = _container::_.elements; |
---|
20 | //Code AddElement = _container::AddElement; |
---|
21 | Real AddElement(Real valor) { _container::AddElement(valor) }; |
---|
22 | Real __destroy(Real void) { _container::Clear(?) } |
---|
23 | }; |
---|
24 | |
---|
25 | // @_Container es la clase núcleo (que antes era @Container) |
---|
26 | // sus instancias sólo son tratadas por la clase intermediaria (@_Container). |
---|
27 | // Los objetos (@Element) que necesitan conocer información sobre el resto |
---|
28 | // de los elementos en el contenedor dispondrán de una referencia a ella. |
---|
29 | // Con ella podrán acceder por ejemplo a los otros elementos con los que |
---|
30 | // comparten contenedor. |
---|
31 | |
---|
32 | Class @_Container { |
---|
33 | Set _.elements = Copy(Empty); |
---|
34 | Real AddElement(Real valor) { |
---|
35 | @Element element = [[ |
---|
36 | @_Container _parent = _this; |
---|
37 | Real _.valor = valor |
---|
38 | ]]; |
---|
39 | Set Append(_.elements, [[element]]); |
---|
40 | 1 |
---|
41 | }; |
---|
42 | Real Clear(Real void) { |
---|
43 | Set _.elements := Copy(Empty); |
---|
44 | 1 |
---|
45 | } |
---|
46 | }; |
---|
47 | |
---|
48 | Class @Element { |
---|
49 | @_Container _parent; |
---|
50 | Real _.valor |
---|
51 | }; |
---|
52 | |
---|
53 | // Externamente el manejo de las clases puede ser equivalente |
---|
54 | // y el usuario de las mismas no necesita saber que existe la clase |
---|
55 | // @_Container. |
---|
56 | |
---|
57 | @Container container; |
---|
58 | |
---|
59 | Real container::AddElement(5); |
---|
60 | |
---|