virtuales una subprogramas qué que puras polimorfismo método metodo herencia función funciones ejercicios con clase apuntadores animal delphi overloading

una - Delphi: el método ''Crear'' oculta el método virtual de base, pero está justo ahí



qué es una función o método virtual (2)

Considere la jerarquía de objetos hipotéticos, comenzando con:

TFruit = class(TObject) public constructor Create(Color: TColor); virtual; end;

y su descendiente:

TApple = class(TFruit) public constructor Create(); overload; virtual; constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain end;

La idea aquí es que he anulado al constructor virtual de la clase base, con una sobrecarga que también es virtual.

Delphi se queja:

El método ''Crear'' oculta el método virtual del tipo base ''TFruit''

Excepto que no lo oculta, ¡está ahí!

  • Anulé el método virtual en el ancestro, y
  • lo sobrecargué con otra versión

¿Cual es el trato?


Dos soluciones:

type TFruit = class(TObject) public constructor Create(Color: TColor); virtual; end; TApple = class(TFruit) public constructor Create(); reintroduce; overload; constructor Create(Color: TColor); overload; override; end;

O:

type TFruit = class(TObject) public constructor Create; overload; virtual; abstract; constructor Create(Color: TColor); overload; virtual; end; TApple = class(TFruit) public constructor Create(); override; constructor Create(Color: TColor); override; end;


Esto parece ser un tipo de problema "que vino primero". (Parece que NGLN encontró una solución).

Hay otra solución, también. Puedes usar un parámetro por defecto:

interface type TFruit=class(TObject) public constructor Create(Color: TColor); virtual; end; TApple=class(TFruit) public constructor Create(Color: TColor = clRed); override; end; implementation { TFruit } constructor TFruit.Create(Color: TColor); begin inherited Create; end; { TApple } constructor TApple.Create(Color: TColor); begin inherited; end; // Test code var AppleOne, AppleTwo: TApple; begin AppleOne := TApple.Create; AppleTwo := TApple.Create(clGreen); end;