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.
- Timestamp:
-
Dec 12, 2009, 3:51:01 PM (15 years ago)
- Author:
-
Víctor de Buen Remiro
- Comment:
-
--
Legend:
- Unmodified
- Added
- Removed
- Modified
-
v10
|
v11
|
|
42 | 42 | === Uso de miembros de tipo Code === |
43 | 43 | |
44 | | En OOP no se recomienda el uso de miembros que apunten a funciones asignables como pueden ser los punteros de funciones en C++ o los objetos de tipo Code en TOL. Una función asignable pretende recoger comportamientos polimórficos impredecibles y eso en OOP se trata mediante herencia de métodos virtuales. |
| 44 | En OOP no se recomienda el uso de miembros que apunten a funciones asignables como pueden ser los punteros de funciones en C++ o los objetos de tipo Code en TOL. Una función asignable pretende recoger comportamientos polimórficos impredecibles y eso en OOP se trata mediante herencia de métodos virtuales explicados más adelante. |
45 | 45 | |
46 | 46 | TOL dará un un mensaje de aviso cuando esto ocurra, aunque se permitirá su uso por si fuera necesario en casos extremos. |
… |
… |
|
56 | 56 | Si la declaración de un elemento de la clase va precedida por la palabra reservada '''Static''', entonces dicho elemento será compartido por tadas las intancias de dicha clase y para referirse a ellos fuera del ámbito de la misma será necesario utilizar la sintaxis {{{<nombre_de_clase>::<nombre_de_elemento>}}} |
57 | 57 | |
58 | | == Instancias == |
59 | | Una instancia de una clase es un NameBlock que cumple la API definida por dicha clase y define al menos todos los miembros sin valor por defecto. Obsérvese que el orden de declaración de los miembros es irrelevante e independiente del orden de herencia de las clases. |
60 | | |
61 | | {{{ |
62 | | VectorDoc.Ser vd.ser = |
63 | | [[ |
64 | | Text _.name = "Viernes"; |
65 | | Text _.description = "Es 1 los días viernes y 0 el resto"; |
66 | | Serie _ser = CalInd(WD(5),C) |
67 | | ]]; |
68 | | |
69 | | VectorDoc.Mat vd.mat = |
70 | | [[ |
71 | | Text _.name = "Constante"; |
72 | | Matrix _mat = SetCol(NCopy(1,100)); |
73 | | Text _.description = "Siempre vale 1" |
74 | | ]]; |
75 | | }}} |
76 | | |
77 | | Para ser más exacto sólo esposibe crear instancias de una clase no virtual, es decir, con todos los métodos implementados, lo cual se explicará más adelante. |
78 | | |
79 | 58 | == Clases == |
| 59 | |
| 60 | Como ya se ha dicho una clase es un tipo de estructura de información especial que engloba datos y funcionaidades asociadas. En TOl los nombres de las clases son palabras reservadas del parser que no pueden ser utilizadas para otro tipo de identificadores y para evitar un uso fortuito y errores difíciles de detectar se obliga a que sus nombres empiecen por el caracter especial '''@'''. A partir de la versión 2.0.1 se recomienda también que los {{{Struct}}} comiencen por '''@''' y desde la 2.0.2 será obligatorio. |
80 | 61 | |
81 | 62 | === Clases primarias === |
… |
… |
|
87 | 68 | |
88 | 69 | {{{ |
89 | | Class Doc |
| 70 | Class @Doc |
90 | 71 | { |
91 | 72 | Text _.name; |
… |
… |
|
99 | 80 | |
100 | 81 | {{{ |
101 | | Class Doc |
| 82 | Class @Doc |
102 | 83 | { |
103 | 84 | Text _.name; |
… |
… |
|
112 | 93 | |
113 | 94 | {{{ |
114 | | Class Doc |
| 95 | Class @Doc |
115 | 96 | { |
116 | 97 | Text _.name; |
… |
… |
|
126 | 107 | |
127 | 108 | {{{ |
128 | | Class Vector |
| 109 | Class @Vector |
129 | 110 | { |
130 | 111 | Matrix get.column (Anything unused); |
… |
… |
|
142 | 123 | //Si no se quiere cambiar nada con herencia múltiple se enumeran las clases |
143 | 124 | //antecesoras |
144 | | Class VectorDoc: Vector, Doc; |
| 125 | Class @VectorDoc: Vector, Doc; |
145 | 126 | |
146 | 127 | //Con herencia simple no tiene mucho sentido no cambiar nada |
147 | 128 | //pues sería una simple clonación de tipos |
148 | | Class VectorDoc.Ser: VectorDoc |
| 129 | Class @VectorDoc.Ser: @VectorDoc |
149 | 130 | { |
150 | 131 | Serie _ser; |
… |
… |
|
156 | 137 | }; |
157 | 138 | |
158 | | Class VectorDoc.Mat: VectorDoc |
| 139 | Class @VectorDoc.Mat: @VectorDoc |
159 | 140 | { |
160 | 141 | Matrix _mat; |
… |
… |
|
172 | 153 | |
173 | 154 | {{{ |
174 | | Class Input |
| 155 | Class @Input |
175 | 156 | { |
176 | 157 | VectorDoc _.data; |
… |
… |
|
194 | 175 | Una clase puede tener un miembro que es una instancia de otra clase |
195 | 176 | {{{ |
196 | | Class Output |
| 177 | Class @Output |
197 | 178 | { |
198 | 179 | VectorDoc _.data; |
… |
… |
|
201 | 182 | }}} |
202 | 183 | |
203 | | === Las clases vistas como tipos de usuario === |
204 | | |
205 | | Los nombres de clase funcionarán como tipos definidos por el usuario a todos los efectos, salvo alguna excepción debida a las limitaciones del parser de TOL y que quedarán debidamente documentadas. Es posible entonces declarar argumentos de función de una clase determinada lo cual admitirá cualquier NameBlock que sea instancia de esa clase o cualquier clase heredada de ella. |
206 | | |
207 | | {{{ |
208 | | Matrix sum(Vector a, Vector b) |
209 | | { |
210 | | a::get.data(0) + b::get.data(0) |
211 | | }; |
212 | | |
213 | | Matrix c = sum(vd.ser, vd.mat); |
214 | | }}} |
215 | | |
216 | 184 | === Predeclaración de clases === |
217 | 185 | |
… |
… |
|
221 | 189 | |
222 | 190 | //Forward declaration |
223 | | Class ClHeight; |
| 191 | Class @ClHeight; |
224 | 192 | |
225 | 193 | //This class uses ClHeight as a method argument |
226 | | Class ClAge |
| 194 | Class @ClAge |
227 | 195 | { |
228 | 196 | Text _.name; |
… |
… |
|
235 | 203 | |
236 | 204 | //This class uses ClAge as a method argument |
237 | | Class ClHeight |
| 205 | Class @ClHeight |
238 | 206 | { |
239 | 207 | Text _.name; |
240 | 208 | Real _.height; |
| 209 | Real equalName(@ClAge arg) |
| 210 | { |
| 211 | _.name==arg::_.name |
| 212 | } |
| 213 | }; |
| 214 | }}} |
| 215 | |
| 216 | == Instancias == |
| 217 | Una instancia de una clase es un NameBlock que cumple la API definida por dicha clase y define al menos todos los miembros sin valor por defecto. Obsérvese que el orden de declaración de los miembros es irrelevante e independiente del orden de herencia de las clases. |
| 218 | |
| 219 | {{{ |
| 220 | @VectorDoc.Ser vd.ser = |
| 221 | [[ |
| 222 | Text _.name = "Viernes"; |
| 223 | Text _.description = "Es 1 los días viernes y 0 el resto"; |
| 224 | Serie _ser = CalInd(WD(5),C) |
| 225 | ]]; |
| 226 | |
| 227 | @VectorDoc.Mat vd.mat = |
| 228 | [[ |
| 229 | Text _.name = "Constante"; |
| 230 | Matrix _mat = SetCol(NCopy(1,100)); |
| 231 | Text _.description = "Siempre vale 1" |
| 232 | ]]; |
| 233 | }}} |
| 234 | |
| 235 | Para ser más exacto sólo esposibe crear instancias de una clase no virtual, es decir, con todos los métodos implementados. |
| 236 | |
| 237 | === Constructores de instancias === |
| 238 | La forma más recomendada de crear instancias de forma regulada es mediante construtores que son métodos estáticos que devuelven una instancia de esa clase |
| 239 | |
| 240 | {{{ |
| 241 | Class @Sphere |
| 242 | { |
| 243 | Real _.radius; |
241 | 244 | Real equalName(ClAge arg) |
242 | 245 | { |
243 | 246 | _.name==arg::_.name |
244 | | } |
245 | | }; |
246 | | }}} |
247 | | |
| 247 | }; |
| 248 | Static @ClHeight(Text name, Real height) |
| 249 | { |
| 250 | @ClHeight new = |
| 251 | [[ |
| 252 | Text _.name; |
| 253 | Real _.height; |
| 254 | ]] |
| 255 | } |
| 256 | }; |
| 257 | }}} |
| 258 | |
| 259 | === Las clases vistas como tipos de usuario === |
| 260 | |
| 261 | Los nombres de clase funcionarán como tipos definidos por el usuario a todos los efectos, salvo alguna excepción debida a las limitaciones del parser de TOL y que quedarán debidamente documentadas. Es posible entonces declarar argumentos de función de una clase determinada lo cual admitirá cualquier NameBlock que sea instancia de esa clase o cualquier clase heredada de ella. |
| 262 | |
| 263 | {{{ |
| 264 | Matrix sum(@Vector a, @Vector b) |
| 265 | { |
| 266 | a::get.data(0) + b::get.data(0) |
| 267 | }; |
| 268 | |
| 269 | Matrix c = sum(vd.ser, vd.mat); |
| 270 | }}} |