close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Ticket #863: ticket_17B.ObjectDecompilation.tol

File ticket_17B.ObjectDecompilation.tol, 2.0 KB (added by pgea@…, 15 years ago)
Line 
1
2Class @Element;
3Class @_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
17Class @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
32Class @_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
48Class @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
59Real container::AddElement(5);
60