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 (16 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 | }}} |