tokyo - delphi wikipedia
Clase abstracta en Delphi (4)
Estoy usando un conjunto de componentes que tiene muchas clases abstractas. Ahora quiero aplicar polimorfismo, pero obtengo la clase abstracta de error cuando creo mi objeto.
¿Debo anular todos los métodos que son virtuales, incluso si no lo necesito? ¿Hay alguna solución o solución?
Delphi no tiene clases abstractas como tales, solo métodos abstractos. Obtendrá una excepción de método abstracto planteada si llama a un método abstracto.
En pocas palabras, no debes llamar a métodos abstractos. El compilador emite un calentamiento si detecta la instancia de una clase con métodos abstractos. Una buena práctica es pedirle al compilador que convierta estas advertencias en errores.
Para crear una instancia de una clase, debe anular todos los métodos que se declaran como abstractos virtuales. Incluso si no los usa.
Si realmente quieres un trabajo alternativo, puedes usar métodos vacíos. Pero no lo recomendaré.
Y para agregar más información sobre el tema:
Un método es abstracto si se declara con un resumen virtual:
procedure MyMethod(const AMyParameter: Integer); virtual; abstract;
Trivia: incluso puede anular un método como abstracto:
procedure MyMethod(const AMyParameter: Integer); override; abstract;
Debe sobrescribir estos métodos para crear instancias de esa clase.
Y puedes declarar una clase completa como abstracta:
type
TMyClass = class abstract (TMyAncestor)
end;
Recibirá una advertencia si intenta crear una instancia de esa clase.
La contraparte es una clase sellada:
type
TMyClass = class sealed (TMyAncestor)
end;
Recibes una advertencia si intentas heredar de esa clase.
También puede sellar métodos, pero necesita la palabra clave final para eso.
procedure MyMethod(const AMyParameter: Integer); override; final;
Su clase descendiente sigue siendo abstracta si
- se declara
abstract
, o - tiene al menos un método declarado abstracto, o
- no anula e implementa todos los métodos abstractos de sus antepasados
Producirá un error si anula el constructor abstracto, ya que coloca automáticamente heredado en el nuevo constructor que, por supuesto, está llamando al constructor abstracto si utiliza el código autocompletado.
p.ej
type
TMyclass = class (TObject)
public
constructor Create(AOwner : TComponent); dynamic; abstract;
end;
TMyclass2 = class(TMyclass)
public
Constructor Create(AOwner : TComponent); override;
end;
implementation
constructor TMyclass2.Create(AOwner: TComponent);
begin
inherited;
end;