Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Constructores (https://www.clubdelphi.com/foros/showthread.php?t=76734)

FairyLady 23-11-2011 16:12:37

Constructores
 
Hola. Saludos a todos. Soy nueva en el foro, pero creo que estoy en el sector correcto, disculpen si no. Tengo una duda con respecto a los constructores de delphi. Es necesario declararlos en cada clase? O pueden usarse los Default que heredan de Tobject?. ( O de ser necesario solo en determinados casos,¿ En cuales?).

Yo no declare constructores en ninguna clase, Solo en el programa principal. Algo de este modo.

Código Delphi [-]
Procedure blabla();
Var
  Vclase1: Tclase1;
Begin 
  Vclase1:= Tclase1.create;
  (mas codigo)
End;

Pero haciendo esto, no me dio acceso a los componentes ni funciones de la clase. (Estan todas declaradas como public).

No tira errores, solo una advertencia de que cree un objeto de la clase, que no se uso.

Si alguno puede responderme, se lo agradesco muchisimo!!!
Saludos

Neftali [Germán.Estévez] 23-11-2011 17:12:48

Hola y bienvenida a los foros.
Te recomiendo que revises nuestra Guía de estilo.

Para que el código se lea bien, lo mejor es usar TAG's.

En cuanto a tu pregunta, una vez creado el objeto de la clase Tclase1, deberías poder acceder a los métodos de esa clase sin problemas:

Código Delphi [-]
Procedure blabla();
Var
  Vclase1: Tclase1;
Begin 
  Vclase1:= Tclase1.create;

  VClase1.metodo1;
  VClase1.funcion1(1, 'casa');

  (más código)

End;

Estando metodo1 y funcion1 definidos en la clase Tclase1.

ecfisa 23-11-2011 17:21:49

Cita:

tengo una duda con respecto a los constructores de delphi. Es necesario declararlos en cada clase? O pueden usarse los Default que heredan de Tobject?.
Hola FairyLady.

Podés utilizar el constructor heredado o si necesitas inicializar algo en la creación de la instancia, podes definir el constructor para tu clase.
Pero siempre necesitarás crear una instancia de la clase antes de usarla.

Un ejemplo muy simple, si tenemos:
Código Delphi [-]
type
  TMiClase = class
  public
    a: Integer; 
  ...

var
  MClase: TMiClase;
begin
  MClase.a = 5; // error

  // lo correcto es
  MClase:= TMClase.Create;
  MClase.a:= 5;

Otro caso:
Código Delphi [-]
type
  TMiClase = class
  public
    a: Integer; 
    constructor Create(Value: Integer);
  ...

var
  MClase: TMiClase;
begin
  MClase:= TMiClase.Create; // error
  // lo correcto es
  MClase:= TMiClase.Create(6);

Para eso claro, debemos haber echo con anterioridad:
Código Delphi [-]
constructor TMClase.Create(Value: Integer);
begin
  a:= Value;
end;

Espero no haber sido muy enrredado...

Saludos.

FairyLady 23-11-2011 17:45:24

Muy Buena informacion sobre los constructores! y muy clara. muchas gracias :)

FairyLady 23-11-2011 17:49:42

Con respecto a esa parte de la pregunta, sigo teniendo el mismo problema :(. Tengo todo bien definido en la clase. Sin constructores. y al querer usar el constructor default, me crea el objeto, pero no me deja acceder a ningun atributo ni metodo. Pido disculpas por lo del codigo, de ahora en mas usare los TAG's.

ecfisa 23-11-2011 17:56:27

Cita:

al querer usar el constructor default, me crea el objeto, pero no me deja acceder a ningun atributo ni metodo.
Hola.

No entiendo bién lo que te sucede, ¿ Te arroja algún mensaje de error ? ¿ Podrías poner (en líneas generales) el código donde declaras la clase y donde intentas usarla ?

Un saludo.

FairyLady 23-11-2011 18:34:36

No. Ningun mensaje de error. Solo que no me deja acceder a los atributos de la vble. Ahi va el codigo :)

Código Delphi [-]
Type 

Tpaquete = class(TObject)
 Basico: real;
 Function SetTarifa():real;virtual;
 Function CalculaTarifa():real;virtual;Abstract;
end;

TPaqTerr = class(TPaquete)
 TarifaT: real;
 public
  Function Settarifa (): real; override;
 function Calculatarifa (): real; override;
 //constructor Create (eTarifa:Real); overload;
 end;

TPaqAereo = class (Tpaquete)
 TarifaA:real;
 function Settarifa(): real;override;
 function Calculatarifa():real;override;
End;

TpaqMaritimo =class (Tpaquete)
 TarifaM:real;
 function Settarifa():real;Override;
 function Calculatarifa():real;override;
End;

Esas son las declaraciones de clases y tipos. ( El constructor esta comentado ya que no estaba muy segura de como usarlo ni si era necesario).
Código Delphi [-]
Procedure TForm1.BtCalculaClick(Sender: TObject);
Var
Terrenal:Tobject;
begin

Terrenal:= Tpaqterr.create ();

Terrenal.   // aca es principalmente el problema, No accede a ningun atributo de la clase TPAQTERR. -(Tipo paquete terrestre)
Muchas gracias :)

roman 23-11-2011 18:40:55

Terrenal debe sere declarado como TPaqterr o, en su defecto, debes hacer un moldeo:

Código Delphi [-]
TPaqterr(Terrenal)

// Saludos

FairyLady 23-11-2011 18:48:24

En ves de Tobject , tipo tpaqterr, decis vos?

roman 23-11-2011 18:59:17

Así es:

Código Delphi [-]
var
  Terrenal: Tpaqterr;

// Saludos

ecfisa 23-11-2011 19:01:35

Hola.

Exáctamente.

Como te dijo roman, o haces:
Código Delphi [-]
var
  Terrenal:TObject;
begin
  // esto
  TPaqterr(Terrenal).Basico:= 0;
  // o esto
  (Terrenal as TPaqterr).TarifaT:= 1;

O si no, como también te dijo roman:
Código Delphi [-]
var
  Terrenal:TPaqterr;
begin
  Terrenal.Settarifa:= 5;
...

Saludos.

Neftali [Germán.Estévez] 23-11-2011 19:03:53

Cita:

Empezado por FairyLady (Mensaje 419257)
No. Ningun mensaje de error. Solo que no me deja acceder a los atributos de la vble. Ahi va el codigo :)

Digamos que para poder acceder a los métodos del objeto este debe estar definido según la clase correcta; Es decir, si cambias la definición de la variable por esta otra, verás como sí te aparecen los métodos:

Código Delphi [-]
Var
  Terrenal:Tpaqterr;
begin
  Terrenal:= Tpaqterr.create ();
  Terrenal.    

  ..Ahora sí te aparecerán

En el caso, de que quieras o necesites definir la variable como TObject, pero luego la crees de una clase en particular, para acceder a los métodos necesitas hacer un CAST, que es lo que Román te ha mostrado en su mensaje:

Código Delphi [-]
Var
  Terrenal:TObject;
begin
  Terrenal:= Tpaqterr.create ();
  Tpaqterr(Terrenal).    

  ..Ahora sí te aparecerán

También puedes usar esto:

Código Delphi [-]
Var
  Terrenal:TObject;
begin
  Terrenal:= Tpaqterr.create ();
  (Terrenal as Tpaqterr).    

  ..Ahora sí te aparecerán

Con eso le decimos al compilador que aunque hemos definido la variable Terrenal de tipo TObject, la queremos utilizar como tipo Tpaqterr (puesto que la hemos creado utilizando esta última clase.).

FairyLady 23-11-2011 22:00:05

Todo funcionando muy bien! Muchas gracias a los 4!
Ahora tengo otra duda. Utilizar un constructor nos libera de utilizar los metodos SetAtributoy GetAtributo?

ecfisa 23-11-2011 22:14:01

Hola.

Cita:

Utilizar un constructor nos libera de utilizar los metodos SetAtributo y GetAtributo?
Me parece que tenés una confusión, esos métodos, por el nombre, tienen pinta de ser usados para lectura y escritura de alguna propiedad. ¿ Como están declarados en la clase ?

Saludos.

Lepe 24-11-2011 22:24:05

Cita:

Empezado por FairyLady (Mensaje 419286)
Todo funcionando muy bien! Muchas gracias a los 4!
Ahora tengo otra duda. Utilizar un constructor nos libera de utilizar los metodos SetAtributoy GetAtributo?

Normalmente no.

Un caso típico de usar el constructor, es cuando proporcionas un valor por defecto a una propiedad:
Código Delphi [-]

TmiObjecto = class(TObject)
private
  Fmia: integer;
public
  constructor Create; override;
  property MiPropiedad:integer read Fmia write Fmia default 1;
end;

implementation

constructor TmiObjecto.Create;
begin
  Fmia := 1;
end;
Por defecto Delphi inicializará las variables de tipo integer a cero, si queremos que tenga un valor diferente, se suele hacer de esta forma y como ves, tiene poco que ver con los Get y Set. Ahora, al instanciar la clase, se inicializa a 1 la variable privada.

Además eso de "liberar de usar" creo no es apropiado, en realidad siempre tienes ventajas al usar el Get y Set porque puedes hacer operaciones adicionales a la simple asignación, de eso se trata....claro. Yo Normalmente empiezo con "read Fvar write Fvar" y al final siempre termino usando, al menos, el Set.

Saludos


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

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