PDA

Ver la Versión Completa : ¿Cómo hacer referencia a una clases desde otra que se encuentra dentro de la primera?


TecnoBestia
11-10-2012, 23:01:15
Hola a todos.

Tengo una duda, que posiblemente sea fácil para muchos de ustedes pero que me ha generado algunos dolores de cabeza ya que no he podido encontrar información al respecto. De hecho no sé si sea posible hacer lo que quiero.

Tengo dos clases definidas como sigue:



clsHormiga=class(TObject)
private
function DistanciaAlCudrado(k_Individuo:Integer; k_CG:Integer):Double;
protected
public

ListaDeNodosAClasificar:VectorINT;

MatrizCG:MatrizIR;

VCardinalidades:VectorINT;

VClasificacion:VectorINT;

ValorDeLaInerciaActual:Double;





{Definición de procedimientos y funciones}

procedure IniciarCG;
procedure CamineYClasifique(NumeroNodosPorClasificar:Integer);
procedure CalcularCG_dada_Clasificacion;
procedure DeterminarVClasificacionYInercia;
procedure CalcularInercia_dados_CG_y_clasificacion;
procedure Intesificar_Rastro_Feromona;

published
end;

//*******************************************************************************************
//############################ Objeto clsColonia ########################################
//*******************************************************************************************
clsColonia=class(TObject)
private
protected
public

Matriz_FeromonaIndi_CG:MatrizIR;

MejorInerciaDeLaHistoria:Double;

MejorHormiga:clsHormiga;

VectorDeHormigas:array of clsHormiga; // Note que en este paso, se define un vector de la otra clases.

Cantidad_de_Hormiga:Integer;

Matriz_FeromonaAux:MatrizIR;


constructor Create(NumHormigas:Integer);
procedure Actualizar_el_rastro_de_la_feromona;
procedure ContruirClasificacion();

published
end;



En la primera clases clsHormiga hay un procedimiento que se llama CalcularCG_dada_Clasificacion; el cual debe usar los datos y modificar la matriz Matriz_FeromonaIndi_CG
que está en la clase clsColonia. Mi pregunta es ¿Cómo se puede hacer referencia a dicha matriz desde dentro de la clases clsHormiga?

Nota:

type
VectorIR=array of Double; //Tipo de Vector de Reales
VectorINT=array of Integer; //Tipo Vector de Enteros
MatrizIR=array of VectorIR; //Tipo Matriz de reales, para la Tabla de Datos
MatrizINT=array of VectorINT; //Tipo de matriz de enteros.

roman
11-10-2012, 23:06:27
Me da la impresión de que a tu clase Hormiga le hace falta una propiedad que referencie a la colonia a la que pertenece. Entonces tus cálculos serán sobre la matriz de esa colonia.

// Saludos

TecnoBestia
13-10-2012, 04:37:41
Gracias por responder, pero no me queda claro, podría hacerme el favor de indicarme como sería lo de la propiedad. No sé que debo hacer. y no sé lo que me hace falta. Gracias de nuevo.

TecnoBestia
13-10-2012, 17:59:31
Gracias por responder:

Me da la impresión de que a tu clase Hormiga le hace falta una propiedad que referencie a la colonia a la que pertenece. Entonces tus cálculos serán sobre la matriz de esa colonia.

// Saludos

Me gustaría que me indicará como debo hacerlo, nunca he visto nada parecido y no sé como y donde definir una propiedad que me haga la referencia. Podrías por favor ser explícito, algunos somos de mente más dura.
Gracias de nuevo por responder.

TecnoBestia
13-10-2012, 18:34:21
No sé como hacer lo que me dices. Gracias por responder, pero no me queda claro que es lo que debo hacer, como genero dicha propiedad. Le agradecería que me pueda ayudar con un ejemplo o una explicación de lo que debo hacer. Gracias de nuevo por responder.

Saludos...

Casimiro Notevi
13-10-2012, 18:56:48
Recuerda nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), gracias por tu colaboración :)

Ten paciencia, la gente no está aquí pendiente de contestar al momento, espera que se conecte Román, que vea el mensaje y que decida contestar.

roman
14-10-2012, 22:03:45
Vamos a ver. Una clase no es lo mismo que un objeto. Una clase no es sino el "molde" para hacer objetos. Entonces, un objeto de la clase Hormiga, no puede acceder, así sin más, a propiedades de la clase Colonia, pues, ¿de qué Colonia en particular se trata?

Es de suponerse que una hormiga pertenece a una colonia y puede haber muchas colonias. Entonces, cada hormiga debbe especificar a qué colonia pertenece. La manera de hacer esto es agregando a la clase Hormiga un apropiedad de tipo Colonia:


TColonia = class; // necesario para que el compilado sepa qué la declaración de TColonia viene después

THormiga = class
public
Colonia: TColonia; // Colonia a la que pertenece la hormiga
procedure CalcularCG_dada_Clasificacion;
end;

TColonia = class
public
Matriz_FeromonaIndi_CG:MatrizIR;
end;


El método CalcularCG_dada_Clasificacion de la clase Hormiga podrá hacer referencia a la colonia a la que pertenece la hormiga:


procedure THormiga.CalcularCG_dada_Clasificacion;
begin
Self.Colonia.Matriz_FeromonaIndi_CG ...
end;


Dependiendo de cómo construyas tus objetos, tendrás que asignar la colonia a cada hormiga. Si la colonia ya existe podrías hacerlo en el constructor de la clase Hormiga, pasando la colonia como parámetro:


constructor THormiga(AColonia: TColonia);
begin
inherited;
Self.Colonia := AColonia;
end;


Por último, nota que, aun cuando puedes nombrar tus clases de cualquier manera, yo he puesto el prefijo T en lugar de cls, ya que es lo que se acostumbra en delphi.

// Saludos

TecnoBestia
16-10-2012, 03:39:09
Muchas gracias, me ha quedado muy claro. Le agradezco el tiempo y la paciencia.

Saludos de corazón.