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.

Opened 15 years ago

Closed 15 years ago

Last modified 15 years ago

#947 closed enhancement (fixed)

Investigar la posibilidad de crear miembros locales de instancia aparte de los heredados.

Reported by: Víctor de Buen Remiro Owned by: Víctor de Buen Remiro
Priority: highest Milestone: OOP Implementation
Component: Kernel Version:
Severity: blocker Keywords:
Cc: Pedro Gea

Description

A veces puede ser interesante que una instancia cree sus propios métodos además de los de las clases a las que pertenece.

En general se puede resolver creando una clase heredada que tenga esos métodos y de la que se cree la instancia pero si se sabe que sólo va a haber una instancia es mucho más cómodo hacerlo directamente en ésta y no se saca ninguna ventaja del mecanismo de clases.

Habría que investigar si es posible hacer este cambio de forma qe no afecte al rendimiento en el resto de ocasiones.

Change History (6)

comment:1 Changed 15 years ago by Víctor de Buen Remiro

Cc: Pedro Gea added
Status: newaccepted

comment:2 Changed 15 years ago by Víctor de Buen Remiro

Ahora mismo sí es posible crear funciones miembro de una instancia pero no funcionan como métodos pues no pueden acceder a los demás miembros y métodos de la clase ni a los de la instancia. Por ejemplo el siguiente código TOL

Class @A 
{
  Real _.value;
  Real getValue(Real unused) { _.value }
};

@A a = 
[[
  Real _.value = 1;
  Real _.otherValue = 3;
  Real getOtherValue(Real unused) { _.otherValue };
  Real getDoubleValue(Real unused) { 2*_.value }
]];

Real v1 = a::getValue(?);
Real v2 = a::getOtherValue(?);
Real v3 = a::getDoubleValue(?);

devuelve estos mensajes de error

ERROR: [1] _.otherValue no es un objeto valido para el tipo Real.

[Call stack]
  [1] Real a::getOtherValue (Real unused)

ERROR: [2] Fallo en la función "getOtherValue"

[Call stack]
  [1] Real a::getOtherValue (Real unused)

Warning: [1] La función :: ha fallado en : 
a::getOtherValue(?)

ERROR: [3] v2 no se pudo crear.

ERROR: [4] _.value no es un objeto valido para el tipo Real.

[Call stack]
  [1] Real a::getDoubleValue (Real unused)

ERROR: [5] Argumentos erróneos para Real * x1 * x2 {Real x1, Real x2}

[Call stack]
  [1] Real a::getDoubleValue (Real unused)

ERROR: [6] Fallo en la función "getDoubleValue"

[Call stack]
  [1] Real a::getDoubleValue (Real unused)

Warning: [2] La función :: ha fallado en : 
a::getDoubleValue(?)

ERROR: [7] v3 no se pudo crear.

comment:3 Changed 15 years ago by Víctor de Buen Remiro

(In [2409]) Refs #947

comment:4 Changed 15 years ago by Víctor de Buen Remiro

(In [2410]) Refs #947
Code members must also assign the NameBlock to its operator

comment:5 Changed 15 years ago by Víctor de Buen Remiro

Resolution: fixed
Status: acceptedclosed

(In [2411]) Fixes #947
Allowing to non class methods of instances to access to class and no class members and methods

comment:6 Changed 15 years ago by Víctor de Buen Remiro

(In [2412]) Refs #947
Im sorry, Code members must not assign the NameBlock to its operator

Note: See TracTickets for help on using tickets.