Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 02-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 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
  #22  
Antiguo 02-03-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ocultar componentes en tiempo de diseño ElDioni OOP 3 29-11-2011 17:41:47
Componentes en tiempo de diseño ElDuc OOP 12 10-02-2011 06:02:15
eventos en tiempo de diseño jar OOP 0 27-01-2007 22:09:11
Indices En Tiempo De Diseño?? amadis Conexión con bases de datos 0 12-04-2006 20:22:01
Diseño en tiempo de ejecucion Nelson Alberto Impresión 2 26-01-2006 09:34:12


La franja horaria es GMT +2. Ahora son las 14:54:44.


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
Copyright 1996-2007 Club Delphi