09th Jul 2008
Algunas ventajas… (¡si eres capaz de recordarlas!) - Parte IV
Antes de comentar nada mas, me gustaría hacer una apreciación sobre la entrada anterior y compartirla con vosotros, sobre algo que quizás ha pasado desapercibido pero que creo que vale la pena comentar. El caso, es que formalmente el ejemplo anterior funciona o da el resultado esperado pero… y aquí viene el pero…
*Resulta un tanto extraño el uso de un parámetro var, que nos permite acceder a la referencia, dentro de un método de clase, que se supone, como dice la misma palabra, va a ser genérico e implícito a la clase y no a la referencia misma.
Alguno habrá comentado… ¡yo ya me había dado cuenta!
Yaaaa
¡Yo también!. De hecho he estado buscando el comentario que hacen al respecto en la ayuda del entorno…
Un segundo que la encuentre…
As a general rule, operators should not modify their operands. Instead, return a new value, constructed by performing the operation on the parameters
Lo cual nos lleva a pensar que no todo lo que funciona siempre es estrictamente correcto… o por otro lado, que no todo lo que se dice es estrictamente cierto. Cada cual lo enfoque como bien crea…
Si algo buscan estas lineas que compartimos, no es precisamente ser formalmente correctas, sino crear un pequeño espacio para reflexionar, donde no exista ese miedo terrible a equivocarnos. Muchas veces me he preguntado a mi mismo, cuantas preguntas habrán quedado sin respuesta en los foros, solo porque mucha de la gente que puede responderlas tiene miedo a decir una tontería. Y si esos son muchos… todavía son muchos mas los que han dejado de preguntar algo, solo porque piensan que los demás van a suponer que su pregunta carece de interés. Así que, de alguna forma, la idea es animaros a preguntar, a levantar la mano, a participar… y a seguir manteniendo la curiosidad por aprender, sin convertir nuestro trabajo en una mera y monótona acción de repetir trozos de código aprendidos.
Ahora podemos seguir. Ya no se por donde ibamos…
Sí. Hablábamos de los Registros.
Veamos otro ejemplo donde podemos usar el operador implícito y la suma. He tenido que modificar un poco el código anterior, y el resultado de su ejecución será una ventana como la imagen siguiente:

Veamos en primer lugar la unidad donde hemos declarado la estructura Record.
En esta ocasión voy a omitir comentarios explicativos porque el código es bastante claro, pero yo en vuestro caso, fijaría mi atención al momento en que se produce la asignación implícita, y como en nuestra ventana de resultados no aparece el nombre de la tarifa (tf)…
unit uRegistros2;
interface
type
TTarifaRecord = record
private
FNombreTarifa: String;
FPrecio: Double;
procedure SetNombreTarifa(const Value: String);
procedure SetPrecio(const Value: Double);
public
class operator Add(t1, t2: TTarifaRecord): TTarifaRecord;
class operator Explicit(ATarifa: TTarifaRecord): Double;
class operator Implicit(APrecio: Double): TTarifaRecord;
property Precio: Double read FPrecio write SetPrecio;
property NombreTarifa: String read FNombreTarifa write SetNombreTarifa;
end;
implementation
class operator TTarifaRecord.Implicit(APrecio: Double): TTarifaRecord;
begin
Result.Precio:= APrecio;
end;
class operator TTarifaRecord.Explicit(ATarifa: TTarifaRecord): Double;
begin
Result:= ATarifa.Precio
end;
class operator TTarifaRecord.Add(t1, t2: TTarifaRecord): TTarifaRecord;
begin
Result.FPrecio:= t1.FPrecio + t2.FPrecio;
Result.FNombreTarifa:= t1.FNombreTarifa + ‘+’ + t2.FNombreTarifa;
end;
procedure TTarifaRecord.SetNombreTarifa(const Value: String);
begin
FNombreTarifa := Value;
end;
procedure TTarifaRecord.SetPrecio(const Value: Double);
begin
FPrecio := Value;
end;
end.
Para ver en funcionamiento nuestro registro nos basta añadir un evento click a cualquier boton de nuestro formulario y encadenar unas lineas de código que usen los operadores.
procedure TForm1.Button1Click(Sender: TObject); var c: Integer; t1: Double; tf, tf1: TTarifaRecord; s: String; begin tf.Precio:= 4; tf.NombreTarifa:= ‘Tarifa1′; tf1.Precio:= 3; tf1.NombreTarifa:= ‘Tarifa2′; c:= 5; tf:= c * Double(tf); s:= tf.NombreTarifa + ‘ vale en un primer momento ‘ + FormatFloat(’0.00′, tf.Precio) + ‘.’ + #13#10; tf:= 5; t1:= TTarifaRecord(8).Precio; tf:= t1 * tf.Precio; s:= s + ‘En un momento posterior vale ‘ + FormatFloat(’0.00′, tf.Precio)+ #13#10; tf:= tf + tf1; s:= s + ‘Si se suman ‘ + tf.NombreTarifa + ‘ el resultado es ‘ + FormatFloat(’0.00′, tf.Precio); ShowMessage(s); end;
Y ya para acabar, he recogido un párrafo de la ayuda que nos comenta la diferencia entre clases y registros, que es lo suficientemente explicito y claro como para no ser necesario traducirlo
Though records can now share much of the functionality of classes, there are some important differences between classes and records.
Records do not support inheritance.
Records can contain variant parts; classes cannot.
Records are value types, so they are copied on assignment, passed by value, and allocated on the stack unless they are declared globally or explicitly allocated using the New and Dispose function. Classes are reference types, so they are not copied on assignment, they are passed by reference, and they are allocated on the heap.
Records allow operator overloading on the Win32 and .NET platforms; classes allow operator overloading only for .NET.
Records are constructed automatically, using a default no-argument constructor, but classes must be explicitly constructed. Because records have a default no-argument constructor, any user-defined record constructor must have one or more parameters.
Record types cannot have destructors.
Virtual methods (those specified with the virtual, dynamic, and message keywords) cannot be used in record types.
Unlike classes, record types on the Win32 platform cannot implement interfaces; however, records on the .NET platform can implement interfaces.
Sigo pensando, y no deja de ser una opinión, la mía, con la que no se tiene por qué estar de acuerdo, que no tiene demasiado sentido este giro o nueva funcionalidad de la estructura Record. Pero ya que está… pues eso… ¡hay que intentar sacar el máximo partido a estos recursos!
¡y la única forma es conocerlos y acostumbrarnos a su uso!
¡Que tengais un buen día!
Posted by Administrador under
Delphi
No Comments »
















