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