![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
Creo que deber revisar tus apuntes sobre Programación Orientada a Objetos.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment |
|
#2
|
|||
|
|||
|
Hola, entiendo que self es una referencia a un objeto, pero no entiendo por que no puede cambiarse, en otros lugares he usado la instrucción
Código:
VecinoParticula:=VecinoAux9.Clon; Código:
VecinoAux9:=Self.Clon; El procedimiento correspondiente es: Código:
function clsParticula.Clon():clsParticula;
var
i:Integer; {Esta función realiza un clon independiete, elimina el uso de punteros en las instancias}
begin
Result:=clsParticula.Create;
Result.VClasificacion:=Copy(Self.VClasificacion);
Result.VCoordenadasActual:=Copy(Self.VCoordenadasActual);
Result.VCoordenasPosicionAnterior:=Copy(Self.VCoordenasPosicionAnterior);
Result.VCoordenadasMejorPosicion:=Copy(Self.VCoordenadasMejorPosicion);
Result.VDistancias:=Copy(Self.VDistancias);
Result.ValorDeLaInerciaActual:=Self.ValorDeLaInerciaActual;
Result.ValorInerciaEnMejorPosicion:=Self.ValorInerciaEnMejorPosicion;
Result.VCardinalidades:=Copy(Self.VCardinalidades);
Result.VVelocidad:=Copy(Self.VVelocidad);
//Tabu
Result.OperaRealizadaVecino:=Self.OperaRealizadaVecino;
Result.PosicionModificadaParaVecino:=Self.PosicionModificadaParaVecino;
Result.PosicionAActualizarEnLT:=Self.PosicionAActualizarEnLT;
SetLength(Result.ListaTabu,2,TamaMaxListaTabu);
Result.ListaTabu[0]:=Copy(Self.ListaTabu[0]);
Result.ListaTabu[1]:=Copy(Self.ListaTabu[1]);
Result.TamaActualLT:=Self.TamaActualLT;
Result.SeGeneroElVecino:=Self.SeGeneroElVecino;
end;
Saludos... |
|
#3
|
||||
|
||||
|
Porque SELF no es una variable, sino una constante. Siempre es la referencia (puntero) al objeto del método que se está ejecutando en ese momento.
Cuando defines un método de una clase, como por ejemplo:
en realidad el compilador lo interpreta como si fuera así:
Y cuando llamas al método:
El compilador lo interpreta como si fuera así:
El caso de RESULT es diferente, ya que sí es una variable cuya posición de memoria se corresponde con la posición de pila donde el llamante tomará el valor devuelto por la función. En cierto modo, una definición como: Se interpreta como si fuera: y si fuera método de una clase...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment Última edición por Ñuño Martínez fecha: 18-12-2013 a las 14:20:18. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| ??Como modificar una variable externa en un procedimiento?? | jasmad | Lazarus, FreePascal, Kylix, etc. | 6 | 01-12-2011 23:40:38 |
| condicionar un procedimiento dentro de otro procedimiento | yossi | Varios | 7 | 17-05-2010 10:47:14 |
| Abrir fichero asociado si la aplicacion ya esta activa. | Geta | Varios | 4 | 13-03-2009 01:43:51 |
| Como hacer un commit dentro de un procedimiento almacenado | altp | Firebird e Interbase | 6 | 03-11-2005 18:21:32 |
| Como modificar valores desde un dbgrid q esta asociado a un QUERY? | fmonte | SQL | 12 | 26-08-2004 22:25:22 |
|