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 #843: ticket_16.AccessingLocalClasses.tol

File ticket_16.AccessingLocalClasses.tol, 2.6 KB (added by pgea@…, 15 years ago)
Line 
1
2//////////////////////////////////////////////////////////////////////////////
3// (1)
4
5// Dentro de un espacio de nombres NB se construye una clase @ClassA
6// y un método Use que usa instancias de esta clase.
7
8NameBlock NB = [[
9
10  Class @ClassA {
11    Real _.value;
12    Real GetValue(Real void) { _.value }
13  };
14  @ClassA ejA = [[ Real _.value = 1 ]];
15
16  Real Use(@ClassA ej) { ej::GetValue(?) };
17
18  Class @ClassB : @ClassA
19
20]];
21
22// También se construye una clase derivada de @ClassA llamada @ClassB
23
24NB::@ClassB ejB = [[ Real _.value = 2 ]];
25
26// Nótese que las instancias de @ClassB también los son de @ClassA
27
28Real NB::Use(ejB);
29// (OK)
30
31//////////////////////////////////////////////////////////////////////////////
32
33// Fuera de NB se intenta construir una clase derivada de @ClassA
34// pero no se crea adecuadamente.
35
36Class @ClassC : NB::@ClassA;
37
38@ClassC ejC = [[ Real _.value = 2 ]];
39
40// La clase @ClassC no se crea adecuadamente
41// No hereda de la clase @ClassA y no puede ser usado con el método Use.
42
43Real NB::Use(ejC);
44//> ERROR: [] (ejC) no es un NameBlock instancia de @ClassA
45//> ERROR: [] Argumentos erróneos para Real Use (NameBlock ej)
46//> Warning: [] La función :: ha fallado en : NB::Use(ejC)
47
48// Tampoco se construyen sus propios atributos y métodos si se los
49// definimos:
50
51Class @ClassC2 : NB::@ClassA {
52  Real miAtributo = 1;
53  Real miMetodo (Real void) { miAtributo }
54};
55
56@ClassC2 ejC2 = [[ Real _.value = 2 ]];
57
58Real ejC2::miMetodo(?);
59//> Warning: [] La función :: ha fallado en : ejC2::miMetodo(?)
60
61//////////////////////////////////////////////////////////////////////////////
62// (2)
63
64// Si creamos una función para convertir instancias de la clase C a la B
65// funciona correctamente:
66
67NB::@ClassB C2B(@ClassC ejC) {
68  NB::@ClassB ejB = [[ Real _.value = ejC::_.value ]]
69};
70
71NB::@ClassB ejC2B_1 = C2B(ejC);
72//> (OK)
73
74// Si esta función se crea como método de una nueva clase falla:
75
76Class @ClassD { 
77  NB::@ClassB C2B(@ClassC ejC) {
78    NB::@ClassB ejB = [[ Real _.value = ejC::_.value ]]
79  }
80};
81@ClassD cD;
82
83NB::@ClassB ejC2B_2 = cD::C2B(ejC);
84//> Warning: [] La función :: ha fallado en : cD::C2B(ejC)
85//> ERROR: [] ejC2B_2 no se pudo crear.
86
87// Si modificamos la declaración del método, cambiando la salida
88// a NameBlock, ya no falla.
89
90Class @ClassE { 
91  NameBlock C2B(@ClassC ejC) {
92    NB::@ClassB ejB = [[ Real _.value = ejC::_.value ]]
93  }
94};
95@ClassE cE;
96
97NB::@ClassB ejC2B_3 = cE::C2B(ejC);
98//> (OK)
99
100//////////////////////////////////////////////////////////////////////////////
101
102