Ver Mensaje Individual
  #4  
Antiguo 08-12-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Así es. Suponte que tienes un arreglo:

Código Delphi [-]
Objetos: array[1..N] of TObjetoPadre;

Si TObjetoPadre tiene un método virtual Mostrar(...), puedes recorrer polimórficamente el arreglo:

Código Delphi [-]
for I := 1 to N do
  Objetos[i].Mostrar(???);

sin importar si algunos de los objetos son de clases descendientes de TObjetoPadre. El polimorfismo consiste en que se escoge el método adecuado dependiendo de la clase real del objeto.

Pero Mostrar no puede cambiar de parámetros en los descendientes porque entonces, ¿cuáles de ellos especificarías en el código de arriba?

Pero los parámetros de un método (como de cualquier procedimiento) sirven para pasar información.

Suponte que originalmente querías algo como:

Código Delphi [-]
procedure TObjetoPadre.Mostrar(P1, P2);
procedure TObjetoHijo.Mostrar(P1, P2, H1);
procedure TObjetoNieto.Mostrar(P1, P2, H1, N1, N2, N3);

Es decir, los parámetros P son válidos para TObjetoPadre y todos sus descendientes, los parámetros H son válidos para TObjetoHijo y todos sus descendiente y los parámetros N son válidos para TObjetoNieto y todos sus descendientes.

Entonces convierte esos parámetros en propiedades de tus objetos y no pongas parámetros en Mostrar o sólo los de la clase raíz:

Código Delphi [-]
TObjetoPadre = class
  property P1;
  property P2;

  procedure Mostrar; virtual;
end;

TObjetoHijo = class(TObjetoPadre)
  property H1;

  procedure Mostrar; override;
end;

TObjetoNieto = class(TObjetoHijo)
  property N1;
  property N2;
  property N3;

  procedure Mostrar; override;
end;

Habría que ver cómo llenas el arreglo pero en algún momento tienes que construir los objetos que le pones. Apenas los construyas, les asignas valores a sus propiedades específicas según la clase que se use:

Código Delphi [-]
var
  H: TObjetoHijo;

begin
  H := TObjetoHijo.Create;

  H.P1 := ValorDeP1;
  H.P2 := ValorDeP2;
  H.H1 := ValorDeH1;

  Objetos[i] := H;
end;

Entonces, el método Mostrar específico de cada clase usara las propiedades como antes usaba los parámetros. Pero ahora Mostar ya no tiene parámetros, es homogéneo para toda la jerarquía de clases y puedes llamarlo polimórficamente sin problemas:

Código Delphi [-]
for I := 1 to N do
  Objetos[i].Mostrar;

// Saludos

Última edición por roman fecha: 08-12-2005 a las 17:49:14.
Responder Con Cita