Ver Mensaje Individual
  #10  
Antiguo 02-01-2008
adfa adfa is offline
Miembro
 
Registrado: may 2003
Ubicación: Montevideo-Uruguay
Posts: 119
Reputación: 22
adfa Va por buen camino
Cita:
Empezado por seoane Ver Mensaje
Cuando hace un typecast tienes que estar seguro de que los dos tipos son compatibles, en en caso del operado "as" es el mismo el que se encarga de hacer esa comprobación.

Es decir:
Código Delphi [-]
(F as TFProveedores).MiProcedure;

Equivale a esto:
Código Delphi [-]
if F is TFProveedores then
  TFProveedore(F).MiProcedure
else
  // Si no lo es se genera una excepcion

Como ves hacen lo mismo, pero "as" primero hace una comprobación.
Por lo que yo se (y es poquito) me parece que no es asi.
El (objeto as TClaseCualquiera).procedimiento es lo mismo que hacer TClaseCualquiera(objeto).procedimiento.

El as no control que el objeto que se le pase sea de la clase adecuada, antes hay que preguntar con el "is".
El código del botón1 da error en ejecución, el 2 no.
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type animal =class
  end;
  type perro=class(animal)
      procedure ladrar();
  end;
  type gato=class(animal)
  end;
var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure perro.ladrar;
begin
  showmessage('guau');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  bicho : animal;
begin
  bicho := gato.Create;
   (bicho as perro).ladrar;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  bicho : animal;
begin
  bicho := gato.Create;
   if bicho is perro then (bicho as perro).ladrar;
end;

end.
Saludos
Responder Con Cita