Ver Mensaje Individual
  #11  
Antiguo 15-03-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Pues entonces nunca perdiste el polimorfismo; no el polimorfismo de clases.

En objetos, si tomamos el típico ejemplo:

Código Delphi [-]
type
  TFigura = class
    procedure Dibuja(); virtual; abstract;
  end;

  TTriangulo = class(TFigura)
    procedure Dibuja; override;
  end;

  TCirculo = class(TFigura)
    procedure Dibuja; override;
  end;

  TEtcetera = class(TFigura)
    procedure Dibuja; override;
  end;

el polimorfismo se da cuando llamamos al método Dibujar desde una variable del tipo TFigura:

Código Delphi [-]
var
  F: TFigura;

....

F.Dibuja();

ya que, dependiendo de si F fue instanciado como TTriangulo, TCirculo o TEtcetera, el método variará. Si, en cambio, usas una variable del tipo explícito TTriangulo:

Código Delphi [-]
var
  T: TTriangulo;

....

T.Dibuja();

es, como dices, predecible qué método se llamará. Pero no por eso digo que se pierde el polimorfismo.

En el caso de clases es lo mismo: si usas una referencia particular, como TClaseHija, se "pierde" el polimorfismo, tanto como se pierde en TTriangulo. Pero, como tú mismo ejemplificas, si usas una referencia de clase general, como TClaseClass, "recuperas" el polimorfismo.

Lo interesante aquí sería que nos dieras un ejemplo más cercano a lo que quieres decir. Esto es, ¿en qué sentido usar un método de clases no te funciona y una interfaz sí? ¿En qué forma un método de clase que cree objetos no te funciona?

En otras palabras, creo que tienes en mente algo más específico y es eso por lo que yo preguntaba.

LineComment Saludos
No es del todo cierto:

Código Delphi [-]
procedure DibujarTriangulo(const t: TTriangulo);
begin
  t.Dibuja;
end;

Que metodo se ejecuta?
Responder Con Cita