Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-07-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola Neftali, gracias por responder!!

Si después de unas cuantas pruebas llegue a esa misma conclusión, el problema se encuentra en esta definición class of TInifile que es la que determina el orden de búsqueda, y es que al no poder hacer override sobre el constructor por que la clase padre no lo permite, si el compilador se encuentra con varias clases constructoras declaradas de forma idéntica, entonces la búsqueda de procesos la realiza internamente a algo parecido a una lista con esta forma:

Código:
1:TINIFile{ constructor Create(const FileName: string); }  
2: Resto de clases ascendentes a TINIFile
...
N:TMyIniFile { constructor Create(const FileName: string); }
así que el compilador simplemente coge el primer método que encuentra en la lista que sea del tipo que busca, en este caso el definido para TINIFile.

Y lo solucione creando una clase intermedia (TAvIniFile) donde se define el constructor de forma virtual para así poder sobre-escribirlo en las clases descendientes,

Código Delphi [-]

interface
type
  TAvIniFile = class(TIniFile)
  public
    // se marca el constructor como virtual para poder sobre-escribirlo mas adelante
    constructor Create(const FileName: string); overload; virtual; 
  end;

  TMyIniFile = class(TAvIniFile )
  private
  public
    constructor Create(const FileName: string); override; // ya si se puede usar el override
  end;

  TClassIniFile = class of TAvIniFile;

implementation

constructor TAvIniFile.Create(const FileName: string);
begin
  inherited;
  // aqui no es necesario insertar nada mas, solo esta definido para poder hacer override despues
end;

...

y finalmente sustituyo la declaración de classInifile por TclassInifile = class of TAvInifile, de esta forma la lista de búsqueda quedaría así:
Código:
1: clases descendientes a TAvIniFile con el constructor sobre-escrito, aquí se incluye TMyIniFile   
2: TAvIniFile{ constructor Create(const FileName: string); }  
3: TINIFile{ constructor Create(const FileName: string); }  
4: Resto de clases ascendentes a TINIFile
Gracias de nuevo por responder
Un saludo
Responder Con Cita
  #2  
Antiguo 13-07-2018
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Ha estado bien visto esto último, bucanero. Yo, en mi ignorancia, iba a responder de entrada que el método constructor de tu clase INI tenía que ser "override" y no "overload". Pero, al probarlo aquí, me dí cuenta de que no era tan sencillo como hacer esto... no alcancé yo hasta donde llegó el compañero Neftalí, que fue descubrir que el constructor de la clase TIniFile no puede sobrescribirse. Vamos, ni alcabcé yo donde el Neftalí llegó, ni por supuesto se me ocurrió pensar en hacer lo que tú al final has hecho. Está bien saberlo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 13-07-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por dec Ver Mensaje
Yo, en mi ignorancia, iba a responder de entrada que el método constructor de tu clase INI tenía que ser "override" y no "overload". Pero, al probarlo aquí, me dí cuenta de que no era tan sencillo como hacer esto...

Si, yo también me di cuenta del cambio de palabra overload/override David, pero el problema está en la definición de las clases base, que como he dicho no están definidas para que se puedan "sobreescribir".
Como bien dices, al realizar el cambio da el error de "Cannot override a non-virtual method".
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 13-07-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Gracias DEC y movorack por responder

Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Si, yo también me di cuenta del cambio de palabra overload/override David, pero el problema está en la definición de las clases base, que como he dicho no están definidas para que se puedan "sobreescribir".
Como bien dices, al realizar el cambio da el error de "Cannot override a non-virtual method".
Ese es el error que me estuvo trastocando todo el tiempo y la necesidad de buscar alguna alternativa al problema.


En cuanto al reintroduce también lo intente y el resultado fue el mismo. En tu código te ha funcionado porque has llamado directamente al método create de la clase TMyIniFile, y de este modo incluso con el overload funciona
Cita:
Empezado por movorack Ver Mensaje
Puedes usar reintroduce

Código Delphi [-]
  FConfig := TMyIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
pero en mi código la llamada es a traves de una variable que apunta a una clase derivada de TINIFile y no de TMyIniFile, y para este caso el reintroduce también sigue fallando.

Código Delphi [-]
type
  TClassIniFile = class of TInifile;

var
  ClassIniFile: TClassIniFile = nil;
...
  ClassIniFile:=TMyIniFile;
  ClassIniFile.create(IniFileName);



Gracias a todos por dedicarle tiempo a esta cuestión
Un saludo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear objetos mediante su clase coso Trucos 0 05-12-2008 23:37:15
duda al crear un descendiente de tpanel hibero OOP 1 23-05-2008 21:07:52
problema crear dll con clase rzf1983 Varios 9 08-11-2007 22:56:52
crear un evento en una clase? chelox OOP 4 06-06-2007 20:14:20
Crear clase. Basico de POO. DarkByte OOP 17 24-08-2005 17:37:21


La franja horaria es GMT +2. Ahora son las 04:18:29.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi