versiones tokyo embarcadero borland delphi delphi-2009

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

  1. se declara abstract , o
  2. tiene al menos un método declarado abstracto, o
  3. 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;