martes, agosto 29, 2006

Records

Seguiremos con los cambios si vienes de Delphi win32 (la mayoria de los que se quedo en win32 lo hizo con Delphi 7, asi es que habra algunos que ya vieron estos cambios para win32 despues de la version 7) a delphi .Net, otro cambio es en las estructuras de datos tipo Record como el struct en C, aquellas donde podiamos agrupar varios campos se transforma para tener un comportamiento mas parecido a una clase.

En Delphi clasico solo podiamos definir los campos en un Record:

Persona = record
Nombre:
string ;
Paterno:
string ;
Materno:
string ;
Edad : Integer ;
end ;


 y podiamos utilizar esa estructura de la siguiente forma: 


var
p: Persona ;

begin
p.Nombre :
= 'Manuel' ;
p.Paterno :
= 'Perez' ;
p.Materno :
= 'Lopez' ;
p.Edad :
= 22 ;

MessageBox.Show(p.Nombre
+' '+p.Paterno) ;
end ;

 Ahora los tipos Record tambien soportan metodos, propiedades, constructores y tipos anidados, por ejemplo:



type

Persona
= record
Nombre:
string ;
Paterno:
string ;
Materno:
string ;
Edad : Integer ;
function NombreCompleto:
string ;
procedure AsignaEdad(NuevaEdad: Integer) ;
end ;

{ Persona }

procedure Persona.AsignaEdad(NuevaEdad: Integer);
begin
Self.Edad :
= NuevaEdad ;
end;

function Persona.NombreCompleto:
string;
begin
Result :
= Self.Nombre+' '+Self.Paterno+' '+Self.Materno ;
end;


y su uso es practicamente el mismo:



var
p: Persona ;

begin
p.Nombre :
= 'Manuel' ;
p.Paterno :
= 'Perez' ;
p.Materno :
= 'Lopez' ;
p.AsignaEdad(
25);
MessageBox.Show(p.NombreCompleto
+', '+p.Edad.ToString) ;
end ;


Y me imagino que de ahi surge la inche pregunta.. entonces cual es la diferencia entre un record y una clase? Aqui las listo:


* Los Records no soportan herencia.


* Los Records pueden contener partes variantes, las clases no.


* Los Records son tipos por valor, es decir pueden ser copiados en una asignacion, pasarlos por valor, y son alojados en la pila (a menos de que sean declarados globales o explicitamente creados con new y dispose). Las clases son tipos por referencia, no pueden ser copiadas por asignacion, se pasan por referencia y se alojan en el "heap".


* Los Records soportan sobrecarga de operadores en win32 y .Net, las clases solo permiten sobrecarga de operadores en .Net


* Los Records son construidos automaticamente, usando un constructor por default y sin argumentos, si declaras un constructor en un Record este forzosamente tendra que llevar argumentos, mientras que las clases tienen que ser construidas explicitamente.


* Los Records no pueden tener destructores.


* Los metodos virtuales, que son los que especificas con virtual, dynamic o message no pueden ser usados en un Record.


* Los Records en win32 no pueden implementar interfases, pero los Records en .Net si pueden implementarlas.

No hay comentarios.: