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;