Cita:
Empezado por seoane
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
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
public
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