| 15 | | {{{ |
| 16 | | Class Doc |
| 17 | | { |
| 18 | | Text _.name; |
| 19 | | Text _.description |
| 20 | | }; |
| 21 | | }}} |
| 22 | | |
| 23 | | 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 |
| 24 | | |
| 25 | | {{{ |
| 26 | | Class Vector |
| 27 | | { |
| 28 | | Matrix get.column (Anything unused); |
| 29 | | Real has.timeInfo(Anything unused); |
| 30 | | TimeSet dating (Anything unused); |
| 31 | | Date firstDate (Anything unused); |
| 32 | | Date lastDate (Anything unused) |
| 33 | | }; |
| 34 | | }}} |
| 35 | | |
| 36 | | 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: |
| 37 | | |
| 38 | | {{{ |
| 39 | | //Si no se quiere cambiar nada con herencia múltiple se enumeran las clases |
| 40 | | //antecesoras |
| 41 | | Class VectorDoc: Vector, Doc; |
| 42 | | |
| 43 | | //Con herencia simple no tiene mucho sentido no cambiar nada |
| 44 | | //pues sería una simple clonación de tipos |
| 45 | | Class VectorDoc.Ser: VectorDoc |
| 46 | | { |
| 47 | | Serie _ser; |
| 48 | | Matrix get.data (Anything unused) { Tra(SerMat(_ser)) }; |
| 49 | | Real has.timeInfo(Anything unused) { True }; |
| 50 | | TimeSet dating (Anything unused) { Dating(_ser) }; |
| 51 | | Date firstDate (Anything unused) { First(_ser) }; |
| 52 | | Date lastDate (Anything unused) { Last(_ser) } |
| 53 | | }; |
| 54 | | |
| 55 | | Class VectorDoc.Mat: VectorDoc |
| 56 | | { |
| 57 | | Matrix _mat; |
| 58 | | Matrix get.data (Anything unused) { _mat } |
| 59 | | Real has.timeInfo(Anything unused) { False }; |
| 60 | | TimeSet dating (Anything unused) { W }; |
| 61 | | Date firstDate (Anything unused) { UnknownDate }; |
| 62 | | Date lastDate (Anything unused) { UnknownDate } |
| 63 | | }; |
| 64 | | }}} |
| 65 | | |
| 66 | | 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. |
| 67 | | |
| 68 | | {{{ |
| 69 | | VectorDoc.Ser vd.ser = |
| 70 | | [[ |
| 71 | | Text _.name = "Viernes"; |
| 72 | | Text _.description = "Es 1 los días viernes y 0 el resto"; |
| 73 | | Serie _ser = CalInd(WD(5),C) |
| 74 | | ]]; |
| 75 | | |
| 76 | | VectorDoc.Mat vd.mat = |
| 77 | | [[ |
| 78 | | Text _.name = "Constante"; |
| 79 | | Matrix _mat = SetCol(NCopy(1,100)); |
| 80 | | Text _.description = "Siempre vale 1" |
| 81 | | ]]; |
| 82 | | }}} |
| 83 | | |
| 84 | | 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. |
| 85 | | |
| 86 | | {{{ |
| 87 | | Matrix sum(Vector a, Vector b) |
| 88 | | { |
| 89 | | a::get.data(0) + b::get.data(0) |
| 90 | | }; |
| 91 | | |
| 92 | | Matrix c = sum(vd.ser, vd.mat); |
| 93 | | }}} |
| 94 | | |
| 95 | | Esta otra sería una clase primaria parcialmente virtual pues tiene algunos miembros y métodos definidos por defecto y otros no |
| 96 | | |
| 97 | | {{{ |
| 98 | | Class Input |
| 99 | | { |
| 100 | | VectorDoc _.data; |
| 101 | | Real _.enabled = True; |
| 102 | | Polyn _.omega = 1; |
| 103 | | Polyn _.delta = 1; |
| 104 | | Ratio transferFunction (Anything unused) |
| 105 | | { |
| 106 | | _.omega / _.delta |
| 107 | | }; |
| 108 | | Matrix eval(Polyn omega, Polyn delta) |
| 109 | | { |
| 110 | | Polyn _.omega := omega; |
| 111 | | Polyn _.delta := delta; |
| 112 | | MatDifEq(transferFunction, _.vector::get.column(0)) |
| 113 | | } |
| 114 | | }; |
| 115 | | |
| 116 | | Class Output |
| 117 | | { |
| 118 | | VectorDoc _.data; |
| 119 | | Set _.arima |
| 120 | | }; |
| 121 | | }}} |
| 122 | | |
| 123 | | == BSR == |
| 124 | | |
| 125 | | El sistema completo BSR se migra al paradigma OOP para permitir una claridad de uso y eliminar ambigüedad en las API de definición y manejo de los modelos. |
| 126 | | |