| 1 | = OOP in TOL = |
| 2 | |
| 3 | La principal diferencia del nuevo TOL con respecto a sus predecesores será la apuesta por la programación orientada al objeto (OOP). |
| 4 | |
| 5 | Se trataría de que el usuario pudiera definir estructuras de NameBlock, es decir clases virtuales puras en la nomenclatura OOP, con una API mínima para poder usarla como descriptor de argumento en funciones de forma similar al Struct en Set sólo que se permite establecer la API de los métodos. |
| 6 | |
| 7 | La siguiente sería una declaración de clase primaria estructural, ya que no tiene ningún método |
| 8 | |
| 9 | |
| 10 | {{{ |
| 11 | Class Doc |
| 12 | { |
| 13 | Text _.name; |
| 14 | Text _.description |
| 15 | }; |
| 16 | }}} |
| 17 | |
| 18 | La siguiente sería una declaración de clase primaria virtual pura, ya que ningún miembro ni método tiene una definición por defecto |
| 19 | |
| 20 | {{{ |
| 21 | Class Vector |
| 22 | { |
| 23 | Matrix get.column (Anything unused); |
| 24 | Real has.timeInfo(Anything unused); |
| 25 | TimeSet dating (Anything unused); |
| 26 | Date firstDate (Anything unused); |
| 27 | Date lastDate (Anything unused) |
| 28 | }; |
| 29 | }}} |
| 30 | |
| 31 | Es posible crear clases heredadas de otras que implementen métodos o asignen valores por defecto a miembros. También está permitida la herencia múltiple siempre y cuando no exista conflicto entre los métodos y miembros heredados. Si no desea cambiar ninguno de los miembros o métodos por defecto ni añadir nada nuevo, simplemente se listan las clases de las que se quiere heredar. En otro caso se abrirían llaves y se harían las modificaciones o añadidos pertinentes: |
| 32 | |
| 33 | {{{ |
| 34 | //Si no se quiere cambiar nada con herencia múltiple se enumeran las clases |
| 35 | //antecesoras |
| 36 | Class VectorDoc: Vector, Doc; |
| 37 | |
| 38 | //Con herencia simple no tiene mucho sentido no cambiar nada |
| 39 | //pues sería una simple clonación de tipos |
| 40 | Class VectorDoc.Ser: VectorDoc |
| 41 | { |
| 42 | Serie _ser; |
| 43 | Matrix get.data (Anything unused) { Tra(SerMat(_ser)) }; |
| 44 | Real has.timeInfo(Anything unused) { True }; |
| 45 | TimeSet dating (Anything unused) { Dating(_ser) }; |
| 46 | Date firstDate (Anything unused) { First(_ser) }; |
| 47 | Date lastDate (Anything unused) { Last(_ser) } |
| 48 | }; |
| 49 | |
| 50 | Class VectorDoc.Mat: VectorDoc |
| 51 | { |
| 52 | Matrix _mat; |
| 53 | Matrix get.data (Anything unused) { _mat } |
| 54 | Real has.timeInfo(Anything unused) { False }; |
| 55 | TimeSet dating (Anything unused) { W }; |
| 56 | Date firstDate (Anything unused) { UnknownDate }; |
| 57 | Date lastDate (Anything unused) { UnknownDate } |
| 58 | }; |
| 59 | }}} |
| 60 | |
| 61 | 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 y todos los métodos no implementados. Obsérvese que el orden de declaración de los miembros es irrelevante e independiente del orden de herencia de las clases. |
| 62 | |
| 63 | {{{ |
| 64 | VectorDoc.Ser vd.ser = |
| 65 | [[ |
| 66 | Text _.name = "Viernes"; |
| 67 | Text _.description = "Es 1 los días viernes y 0 el resto"; |
| 68 | Serie _ser = CalInd(WD(5),C) |
| 69 | ]]; |
| 70 | |
| 71 | VectorDoc.Mat vd.mat = |
| 72 | [[ |
| 73 | Text _.name = "Constante"; |
| 74 | Matrix _mat = SetCol(NCopy(1,100)); |
| 75 | Text _.description = "Siempre vale 1" |
| 76 | ]]; |
| 77 | }}} |
| 78 | |
| 79 | Los nombres de clase funcionarán como tipos definidos por el usuario a todos los efectos. 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. |
| 80 | |
| 81 | {{{ |
| 82 | Matrix sum(Vector a, Vector b) |
| 83 | { |
| 84 | a::get.data(0) + b::get.data(0) |
| 85 | }; |
| 86 | |
| 87 | Matrix c = sum(vd.ser, vd.mat); |
| 88 | }}} |
| 89 | |
| 90 | Esta otra sería una clase primaria parcialmente virtual pues tiene algunos miembros y métodos definidos por defecto y otros no |
| 91 | |
| 92 | {{{ |
| 93 | Class Input |
| 94 | { |
| 95 | VectorDoc _.data; |
| 96 | Real _.enabled = True; |
| 97 | Polyn _.omega = 1; |
| 98 | Polyn _.delta = 1; |
| 99 | Ratio transferFunction (Anything unused) |
| 100 | { |
| 101 | _.omega / _.delta |
| 102 | }; |
| 103 | Matrix eval(Polyn omega, Polyn delta) |
| 104 | { |
| 105 | Polyn _.omega := omega; |
| 106 | Polyn _.delta := delta; |
| 107 | MatDifEq(transferFunction, _.vector::get.column(0)) |
| 108 | } |
| 109 | }; |
| 110 | |
| 111 | Class Output |
| 112 | { |
| 113 | VectorDoc _.data; |
| 114 | Set _.arima |
| 115 | }; |
| 116 | }}} |
| 117 | |