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 | | |