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.

Changes between Version 10 and Version 11 of TolOop


Ignore:
Timestamp:
Dec 12, 2009, 3:51:01 PM (15 years ago)
Author:
Víctor de Buen Remiro
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • TolOop

    v10 v11  
    4242=== Uso de miembros de tipo Code ===
    4343
    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.
     44En 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.
    4545
    4646TOL dará un un mensaje de aviso cuando esto ocurra, aunque se permitirá su uso por si fuera necesario en casos extremos.
     
    5656Si 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>}}}
    5757
    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 
    7958== Clases ==
     59
     60Como 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.
    8061
    8162=== Clases primarias ===
     
    8768
    8869{{{
    89 Class Doc
     70Class @Doc
    9071{
    9172  Text _.name;
     
    9980
    10081{{{
    101 Class Doc
     82Class @Doc
    10283{
    10384  Text _.name;
     
    11293
    11394{{{
    114 Class Doc
     95Class @Doc
    11596{
    11697  Text _.name;
     
    126107
    127108{{{
    128 Class Vector
     109Class @Vector
    129110{
    130111  Matrix  get.column  (Anything unused);
     
    142123//Si no se quiere cambiar nada con herencia múltiple se enumeran las clases
    143124//antecesoras
    144 Class VectorDoc: Vector, Doc;
     125Class @VectorDoc: Vector, Doc;
    145126
    146127//Con herencia simple no tiene mucho sentido no cambiar nada
    147128//pues sería una simple clonación de tipos
    148 Class VectorDoc.Ser: VectorDoc
     129Class @VectorDoc.Ser: @VectorDoc
    149130{
    150131  Serie  _ser;
     
    156137};
    157138
    158 Class VectorDoc.Mat: VectorDoc
     139Class @VectorDoc.Mat: @VectorDoc
    159140{
    160141  Matrix _mat;
     
    172153
    173154{{{
    174 Class Input
     155Class @Input
    175156{
    176157  VectorDoc _.data;
     
    194175Una clase puede tener un miembro que es una instancia de otra clase
    195176{{{
    196 Class Output
     177Class @Output
    197178{
    198179  VectorDoc _.data;
     
    201182}}}
    202183
    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 
    216184=== Predeclaración de clases ===
    217185
     
    221189
    222190//Forward declaration
    223 Class ClHeight;
     191Class @ClHeight;
    224192
    225193//This class uses ClHeight as a method argument
    226 Class ClAge
     194Class @ClAge
    227195{
    228196  Text _.name;
     
    235203
    236204//This class uses ClAge as a method argument
    237 Class ClHeight
     205Class @ClHeight
    238206{
    239207  Text _.name;
    240208  Real _.height;
     209  Real equalName(@ClAge arg)
     210  {
     211    _.name==arg::_.name
     212  }
     213};
     214}}}
     215
     216== Instancias ==
     217Una 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
     235Para 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 ===
     238La 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{{{
     241Class @Sphere
     242{
     243  Real _.radius;
    241244  Real equalName(ClAge arg)
    242245  {
    243246    _.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
     261Los 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{{{
     264Matrix sum(@Vector a, @Vector b)
     265{
     266  a::get.data(0) + b::get.data(0)
     267};
     268
     269Matrix c = sum(vd.ser, vd.mat);
     270}}}