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 09-03-2007
jam jam is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
jam Va por buen camino
Método free dentro de create

Esto es una curiosidad que tengo:

¿Se podría llamar al método free dentro del constructor create?

Código Delphi [-]
procedure myclass.create(par:integer)
begin
 inherited create(par);
 ...
 if par<0 then
 begin
   inherited free;
   raise exception.create('par<0');
 end;
 ...
end;
...
myclassvar=myClass.create(-1);

Imaginaros que tengo que crear una clase, y que su constructor recibe un parámetro pero que en el caso de que no sean correcto lanze una excepción
y salga del constructor.
Si par<0 ¿qué valor recibe myclassvar?.
¿Hay alguna forma de asignar a myclassvar nil sin utilizar una función adicional?

Gracias.
__________________
-¿no es usted la hija de un famoso banquero?.
-pues no.
-Perdone, pero por un momento pensé que me había enamorado de usted.
Responder Con Cita
  #2  
Antiguo 09-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Al método create no se le debe pasar parámetros, solamente aquel que necesite para crearse el objeto. Ese valor "par" lo puedes incluir como una propiedad del componente..

Precisamente la comprobación de si par es mayor que cero, lo debería hacer el programa principal, no tu clase.

Respecto a tu duda, creo que no existe nada, porque estas "saltándote" la filosofía POO.

Edito:
Código Delphi [-]
type
  EmyClass = class (Exception);

TmyClass = Class(TObject)
private 
  Fpar:integer;
  procedure SetPar(Value:integer);
public
  property Par :integer read Fpar write SetPar
end;

...
procedure TmyClass.SetPar(Value:integer);
begin
  if Value < 0 then
    raise emyClass.CreateFmt('El valor %d debe ser mayor que cero',[Value]);
  else
  begin 
    Fpar := Value;
   ....
  end;
end;
Código Delphi [-]

  myClass = TmyClass.Create;
try
  myclass.par := -1;
except
   on E :EmyClass then
     Freeandnil(myclass);
end;
Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 09-03-2007 a las 18:28:49.
Responder Con Cita
  #3  
Antiguo 09-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Según nos cuenta la ayuda de Delphi:
Cita:
Empezado por Ayuda de Delphi
If an exception is raised during execution of a constructor that was invoked on a class reference, the Destroy destructor is automatically called to destroy the unfinished object.
Es decir, con solo provocar una excepción el método Destroy es llamado de forma automática. En cuanto a lo de asignar el valor nil, basta con que se lo asignes antes de llamar al método Create, si se produce una excepción el valor no se cambiara.

Aunque personalmente me gusta mas el modelo que plantea Lepe.
Responder Con Cita
  #4  
Antiguo 09-03-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues eso no lo sabía, gracias por el apunte seoane. Aunque no creo que esté pensado para abusar de ello.

¿Qué sentido tiene enviar a crear algo si podemos omitir ese tiempo de creación?

Es lo mismo que las excepciones:
- Puedes dejar que ocurran sin más: StrToInt('');
- O puedes prevenirlas usando otras técnicas StrToIntDef, TryStrToInt, etc.

En este caso yo primero preguntaba:
Código Delphi [-]
var value:integer;
begin
  myClass := nil;
  if  Value > 0 then 
  begin
      myClass := TmyClass.Create;
     Par := Value;
  end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 09-03-2007
jam jam is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
jam Va por buen camino
Bueno, ojeando la vcl se pueden encontrar varios ejemplos:

Código Delphi [-]
{ TFileStream }

constructor TFileStream.Create(const FileName: string; Mode: Word);
begin
  if Mode = fmCreate then
  begin
    FHandle := FileCreate(FileName);
    if FHandle < 0 then
      raise EFCreateError.CreateResFmt(@SFCreateError, [FileName]);
  end else
  begin
    FHandle := FileOpen(FileName, Mode);
    if FHandle < 0 then
      raise EFOpenError.CreateResFmt(@SFOpenError, [FileName]);
  end;
end;

aquí se puede ver que se lanzan exepciones, yo lo que quería saber es si hay alguna alternativa a
Código Delphi [-]
try
fn:=Tfilestrem.create('fichero que no existe',fmopen)
except
 fn:=nil;
end;
__________________
-¿no es usted la hija de un famoso banquero?.
-pues no.
-Perdone, pero por un momento pensé que me había enamorado de usted.
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
Could not create output file' Luis Alberto Varios 11 17-05-2007 00:16:44
Clases: Create and destroy jlrbotella OOP 5 09-03-2007 13:11:06
error en create function lookmydoom MySQL 0 12-01-2007 04:20:59
Create Function rickymarti Firebird e Interbase 1 02-12-2004 10:37:00
Can't create socket juanchi Internet 1 09-10-2003 17:58:57


La franja horaria es GMT +2. Ahora son las 20:56:07.


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