Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2003
Legolas Legolas is offline
Miembro
 
Registrado: nov 2003
Posts: 22
Poder: 0
Legolas Va por buen camino
Angry Interfaces

Hola, no tengo muy claro todavia lo que son, ni para que sirven, me refiero a las INTERFACES. Asi que si alguien me puede ayudar, de la manera que sea, le estaria muy agradecido. Gracias
Responder Con Cita
  #2  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Hay mucho texto sobre el tema, te recomiendo buscar el tema en cualquier libro, mismo en el "Delphi Developers Guide"... pero sencillamente las interfaces vienen a ser algo así como clases sin implementación, heredadas de IUnknown. Cuando creas una clase esta clase solo puede heredar de una clase, pero puede heredar de una clase y mas de una interface. Entonces con esto se logra algo similar a la herencia múltiple de otros lenguajes, sin tener el problema de seleccionar qué método implementar, en el caso de que una clase herede de dos clases con un método de igual nombre, como contrapartida tienes que implementar siempre todos los métodos de la interface, esto produce duplicación de código comparado contra la herencia múltiple.

Para los detalles, te recomiendo leer la ayuda que es muy clara en este aspecto.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 14-11-2003
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
dca:

Ya entrados en gastos, ¿conoces de algún ejemplo donde se vea que el uso de interfaces es realmente más conveniente que usar clases abstractas? Claro, omitiendo lo que mencionas de la simulación de herencia múltiple e interfaces COM.

// Saludos
Responder Con Cita
  #4  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Si.. por ejemplo tengo un juego de componentes, del tipo Lookup que heredan de clases diferentes, pero todos estos tienen dos TDataLink´s cada uno, que llaman a métodos de estos componentes. Si no quiero usar interfaces ni RTTI, tengo que crear TDataLink´s específicos para cada clase de componente. Con las interfaces lo que hago es que cuando se crea cada DataLink el componente le asigne el componente dueño como interface, para que este pueda disparar los métodos sin importarle de que clase hallan heredado.

Espero haber sido claro, sino, no duden en consultarme!

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 14-11-2003
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
¿Podrías aclarar un poco? Las interfaces ¿las usas para las clases o para los DataLink?

Ya sé que no puedes publicar el código pero un esqueleto no caería mal.

// Saludos
Responder Con Cita
  #6  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Para las clases, los datalinks dispara métodos en las clases cuando estos reciben alguna notificación.
Esto es un pedazo muy recortado del código, así que no pretendan que funcione:

La Interface:
Código:
  
  IDBLookupControl = interface
    ...
    procedure UpdateDataFields;
    procedure UpdateListFields;
    procedure ListLinkDataChanged;
    ...
  end;
Un DataLink:
Código:
  
TListSourceLookupLink = class(TDataLink)
  private
    ILookup: IDBLookupControl;
  protected
    procedure ActiveChanged; override;
    procedure DataSetChanged; override;
    procedure LayoutChanged; override;
    ...
  public
    constructor Create(ALookupInterface: IDBLookupControl);
    ...
  end;

implementation

{ TListSourceLookupLink }

procedure TListSourceLookupLink.ActiveChanged;
begin
  if Assigned(ILookup) then
    ILookup.UpdateListFields;
end;

constructor TListSourceLookupLink.Create(ALookupControl: TWinControl; ALookupInterface: IDBLookupControl);
begin
  inherited Create;
  ...
  ILookup := ALookupInterface;
end;

procedure TListSourceLookupLink.DataSetChanged;
begin
  if Assigned(ILookup) then
    ILookup.ListLinkDataChanged;
end;


procedure TListSourceLookupLink.LayoutChanged;
begin
  if Assigned(ILookup) then
    ILookup.UpdateListFields;
end;
Uno de los Componentes:
Código:
  TCustomDBLookupControl = class(TCustomIncSearchEdit, IDBLookupControl)
  protected
    ...
    procedure UpdateDataFields; virtual;
    procedure UpdateListFields; virtual;
    procedure ListLinkDataChanged; virtual; abstract;
    ...
  end;

¿Fui claro?... sino, ya saben!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Una Aclaración:
No pongo el resto de los componentes, porque el código es muy similar. Para que sirve esto, para que muchos componentes de clases diferentes reciban notificaciones desde los DataLinks, sin duplicar el código de estos.

Algunos de estos componentes, los pueden bajar de mi página, pero sin el código fuente.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 14-11-2003
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
Ok. Pero ¿no puede hacerse así?

Código:
TDBLookupControl = class(TCustomIncSearchEdit)
  procedure UpdateDateFields; virtual; abstract;
  procedure UpdateListFields; virtual; abstract;
  procedure ListLinkDataChanged; virtual; abstract;
end;
Un DataLink:

Código:
TListSourceLookupLink = class(TDataLink)
  private
    Lookup: TDBLookupControl;
  protected
    procedure ActiveChanged; override;
    procedure DataSetChanged; override;
    procedure LayoutChanged; override;
    ...
  public
    constructor Create(ALookupInterface: IDBLookupControl);
    ...
  end;

implementation

{ La misma, cambiando ILookup por Lookup }
Uno de los componentes:

Código:
  TCustomDBLookupControl = class(TDBLookupControl)
  protected
    ...
    procedure UpdateDataFields; override;
    procedure UpdateListFields; override;
    procedure ListLinkDataChanged; virtual; abstract;
    ...
  end;
// Saludos
Responder Con Cita
  #9  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
No me serviría porque son componentes que vienen de clases diferentes de la VCL, o clases diferentes de componentes no orientado a datos, y no quiero agregarle métodos abstractos de datos.
¿Te convence?...
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #10  
Antiguo 14-11-2003
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
Cita:
delphi.com.ar comentó:
No me serviría porque son componentes que vienen de clases diferentes de la VCL, o clases diferentes de componentes no orientado a datos
Te refieres a que la clase como TCustomIncSearchEdit en la implementación de los componentes puede variar de acuerdo a la componente en específico?

// Saludos
Responder Con Cita
  #11  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Buen, en este caso es así, pero no me refería del todo a eso.
En este caso de TCustomIncSearchEdit, creo varios componentes.. si pruebas los que están en mi web (EditSuite), el TListSearchEdit y el TDBIncrementalSearch heredan de esta clase. En este caso el TListSearchEdit no tiene ninguna relación con bases de datos, así que no tiene porqué tener estos métodos. Si quiero puedo definirlos como protegidos, y sin implementación, pero no me parece muy prolijo.
De todos modos el problema principal, es que puedo tener un componente heredado de TCustomEdit y otro TCustomComboBox con esta interface implementada, y la clase común de estos componentes es TWinControl. No voy a modificar TWinControl ni reescribir todo el código de estos componentes... ¿No?

Espero tu respuesta!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #12  
Antiguo 14-11-2003
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
Permíteme poner otro ejemplo con controles más estandard para ver si estoy entendiendo.

Vamos a suponer que deseo procesar datos ya sea de un ListView o de un StringGrid por igual. Dado que desde un punto de vista lógico ambos no son otra cosa que una matriz podría definir:

Código:
IMatriz = interface
  function Celdas(Ren, Col: Integer): String;
end;
y luego crear descendientes de ListView e StringGrid que implementen esta interfaz:

Código:
TrmListView = class(TListView, IMatriz)
  function Celdas(Ren, Col: Integer): String;
end;

TrmStringGrid = class(TStringGrid, IMatriz)
  function Celdas(Ren, Col: Integer): String;
end;
de manera que a quién procese la información le puedo simplemente dar la interfaz según sea el caso.

De ser así, sí, sí me convences.

// Saludos
Responder Con Cita
  #13  
Antiguo 14-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
En un ejemplo muy diferente... ¡¡Esa es la idea!!

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #14  
Antiguo 14-11-2003
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
Cita:
delphi.com.ar comentó:
En un ejemplo muy diferente... ¡¡Esa es la idea!!
Pero no tan diferente ¿o sí?

La idea en ambos casos es dar a componentes disímiles una funcionalidad común ¿no?

// Saludos
Responder Con Cita
  #15  
Antiguo 17-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
roman comentó:
La idea en ambos casos es dar a componentes disímiles una funcionalidad común ¿no?
Si!... un tercer objeto que interactúa con clases diferentes, pero que implementan "ciertos métodos", declarados en la interface!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 16:00:51.


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