Ver Mensaje Individual
  #21  
Antiguo 02-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita