Por ejemplo esto:
Código Delphi
[-]
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
IAdderSubstractor = interface
function Sumar(const A, B: Integer): Integer;
function Restar(const A, B: Integer): Integer;
end;
IHelloWorld = interface
procedure SayHelloWorld;
end;
TCalculadora = class(TInterfacedObject, IAdderSubstractor, IHelloWorld)
public
function Sumar(const A, B: Integer): Integer;
function Restar(const A, B: Integer): Integer;
procedure SayHelloWorld;
end;
TOtraClase = class
public
procedure Say(const AText: string);
end;
function TCalculadora.Restar(const A, B: Integer): Integer;
begin
Result := A - B;
end;
procedure TCalculadora.SayHelloWorld;
begin
Writeln('Hello world');
end;
procedure TOtraClase.Say(const AText: string);
begin
Writeln(ClassName + ' ' + AText);
end;
function TCalculadora.Sumar(const A, B: Integer): Integer;
begin
Result := A + B;
end;
var
OtraClase: TOtraClase;
Calculadora: TCalculadora;
AdderSubstractor: IAdderSubstractor;
begin
AdderSubstractor := TCalculadora.Create;
if AdderSubstractor is TCalculadora then
Calculadora := TCalculadora(AdderSubstractor);
OtraClase := TOtraClase(AdderSubstractor);
try
try
Writeln(IntToStr(AdderSubstractor.Sumar(10, 5)));
Writeln(IntToStr(Calculadora.Restar(10, 5)));
OtraClase.Say('Hola!');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
Readln;
end;
end.
Una clase puede implementar varias interfaces; luego, mediante el operador
is me aseguro de que puedo realizar un cast sin problemas
El problema del codigo anterior es que la linea OtraClase := TOtraClase(AdderSubstractor);, no solo que compila perfecto, sino que no da error en runtime; hasta que se intenta usar la clase. Evidentemente se produce un access violation al invocar al metodo Say
Luego, otra variante es el uso del
as
Código Delphi
[-]
OtraClase := AdderSubstractor as TOtraClase;
Eso tambien compila perfectamente pero eleva una excepcion EInvalidCast