2009-11-18 15 views
14

Estoy intentando crear una clase hija de TForm conDelphi/Pascal: la sobrecarga de un constructor con un prototipo diferente

  1. un constructor especial para determinados casos, y
  2. un constructor por defecto que va a mantener la compatibilidad con el código actual.

Este es el código que tengo ahora:

interface 
    TfrmEndoscopistSearch = class(TForm) 
    public 
    /// original constructor kept for compatibility 
    constructor Create(AOwner : TComponent); overload; override; 
    /// additional constructor allows for a caller-defined base data set 
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload; 
    end; 

Parece que funciona, pero siempre tengo la advertencia del compilador:

 
[Warning] test.pas(44): Method 'Create' hides virtual method of base type 'TCustomForm' 
  • Adición de "sobrecarga"; después de que el segundo constructor no compilará "[Error] test.pas (44): la declaración de 'Crear' difiere de la declaración anterior".
  • haciendo que el segundo constructor se compile una función de clase sin errores ni advertencias, pero muere con una infracción de acceso en tiempo de ejecución (todos los miembros vars son nulos).

Respuesta

16

Trate de añadir reintroduce antes de la segunda overload, así:

TfrmEndoscopistSearch = class(TForm) 
    public 
    /// original constructor kept for compatibility 
    constructor Create(AOwner : TComponent); overload; override; 
    /// additional constructor allows for a caller-defined base data set 
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); reintroduce; overload; 
    end; 

Esto compila en Turbo Delphi. Necesitaba el public para hacerlo compilar porque la sobrecarga de los métodos published está restringida.

+0

bango! La palabra clave "reintroducir" es exactamente lo que se necesita. El constructor original también es necesario porque establece el conjunto de datos en el valor predeterminado adecuado. –

26

Hay una manera muy fácil de evitar esto. Dale a tu nuevo constructor un nombre diferente. A diferencia de otros lenguajes populares, Delphi tiene constructores con nombre; no tienes que llamarlos Crear. Podría llamar a su nuevo CreateWithDataset y no interferir con el constructor Create virtual.

TfrmEndoscopistSearch = class(TForm) 
    /// original constructor kept for compatibility 
    constructor Create(AOwner: TComponent); override; 
    /// additional constructor allows for a caller-defined base data set 
    constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); 
end; 

De hecho, a menos que estés instanciando esta clase polimórficamente, ni siquiera necesitas el constructor original. Se podría declarar su nuevo uno como este:

TfrmEndoscopistSearch = class(TForm) 
    /// additional constructor allows for a caller-defined base data set 
    constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce; 
end; 

El intento de llamar al constructor de un argumento directamente en TfrmEndoscopistSearch produciría un error de compilación.


(Crearla polimórfica que generalmente implican el uso de Application.CreateForm:.

Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch); 

Eso siempre llama al constructor virtual única argumento introducido en TComponent A menos que sea su forma principal, que no es necesario para hacer eso. he escrito sobre my feelings on Application.CreateForm antes.)

+0

Esta es probablemente la solución más adecuada, pero no es la respuesta a la pregunta.Parte del ejercicio consiste en solucionar el problema y no tener que cambiar ninguno de los otros 10 archivos que ya usan una u otra forma de crear(). Estoy fusionando este formulario de dos proyectos diferentes y no quería bifurcarlo. –

6
constructor Create(AOwner:Tcomponent;str:string);overload; 
... 
constructor TfrmEndoscopistSearch.Create(AOwner: Tcomponent; str: string); 
    begin 
    inherited Create(AOwner); 
    showmessage(str); 
    end; 

Esto debería hacer el truco

Cuestiones relacionadas