Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Tareas repetitvas en tiempo de diseño (https://www.clubdelphi.com/foros/showthread.php?t=89902)

AgustinOrtu 02-03-2016 20:25:59

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

roman 02-03-2016 20:53:30

Pero es que tú hablaste de clases distintas de asignación compatible, y sigo sin saber a qué te refieres, a menos que hables de herencia, pero eso ya lo habíamos mencionado. Por otra parte, no sé si ha cambiado en las versiones actuales, pero, como dije, esto

Cita:

Empezado por AgustinOrtu
Una clase puede implementar varias interfaces; luego, mediante el operador is me aseguro de que puedo realizar un cast sin problemas

no es (¿era?) posible. Para saber si un objeto implementa una interfaz debes usar algo como QueryInterface o Supports.

LineComment Saludos


La franja horaria es GMT +2. Ahora son las 15:09:08.

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