Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-02-2008
adfa adfa is offline
Miembro
 
Registrado: may 2003
Ubicación: Montevideo-Uruguay
Posts: 119
Poder: 21
adfa Va por buen camino
Herencia e interfaces

Hola gente.
Tengo una duda ya que nunca he hecho esto antes en Delphi.

Supongamos que quiero crear un componentes que hereden de TExMaskEdit pero que a su vez implemente un interface con otra propiedades.

Por lo que lei para implementar una interface es necesario que herede de TInterfacedObject, pero yo en realidad necesitaria heredar de TExMaskEdit.
Esto es necesariamente así?

Saludos
Responder Con Cita
  #2  
Antiguo 01-02-2008
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: 27
delphi.com.ar Va por buen camino
Todos los TComponents implementan IInterface y esta es la interfaz de cual heredan todas las interfaces, al igual que todos los objetos heredan de TObject. La clase TInterfacedObject no es mas que un objeto que implementa este IInterface, al igual que TComponent, pero solo con la lógica básica del cual deberían heredar todos nuestros objetos que no superen en jerarquía a TComponent, que implementen interfaces.

En conclusión, como TExMaskEdit hereda de TComponent, no tendrías que tener problemas para que implementen una interfaz propia:


Código Delphi [-]
type
  IMyInterface = interface(IInterface)
    procedure DoAlgo;
  end;

  TMyObject = class(TComponent, IMyInterface)
    procedure DoAlgo;
  end;

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 01-02-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Estupenda explicación Federico.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 01-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola!

Hace días que estuve leyendo sobre interfaces para comprenderlas y ver su utilidad... Por lo que estaba comprendiendo sobre ellas servirían para implementar esas herencias múltiples, para tratar objetos de forma polifórmica (como ser para una Factory, por ejemplo) y me estaba sintiendo un poco conforme con lo que veía...

Pero ahora que leo este hilo, sobre todo el aporte de Federico... me quedo pensando... ¿Entonces, basandonos en el tema inicial, nadie impidería hacer esto?

Código Delphi [-]
TMyMaskEdit = class(TMaskEdit, TMyInterface);

¿El requisito es que se descienda de alguna clase que implemente IInterface?

Ya me estoy confundiendo de nuevo

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 01-02-2008
adfa adfa is offline
Miembro
 
Registrado: may 2003
Ubicación: Montevideo-Uruguay
Posts: 119
Poder: 21
adfa Va por buen camino
Federico muchas gracias por tu respuesta.

Delphius, si yo justamente caigo en la misma confusión.

Es valido entonces hacer lo que dice Delphius, verdad?
Responder Con Cita
  #6  
Antiguo 01-02-2008
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: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por adfa Ver Mensaje
¿El requisito es que se descienda de alguna clase que implemente IInterface?
El requisito en sí es que implementes obligatoriamente todos los métodos de la interfaz, y como todas las interfaces heredan de IInterface, si heredas de un objeto que no haya implementado ninguna interfaz, te verás obligado a implementar sus métodos: (QueryInterface, _AddRef y _Release)
Código Delphi [-]
type
  IInterface = interface
    ['{00000000-0000-0000-C000-000000000046}']
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  end;

Por eso si queremos crear un objeto simple, heredado de TObject que implemente una interfaz, podemos usar TInterfacedObject como parte de su linaje .

Resumiendo nuevamente, como TMaskEdit es un TComponent puedes hacer exactamente lo que describes.


PD: Dec, creía haberme enredado como de costumbre en la explicación
__________________
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 01-02-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Cita:
Empezado por delphi.com.ar Ver Mensaje
Por eso si queremos crear un objeto simple, heredado de TObject que implemente una interfaz, podemos usar TInterfacedObject como parte de su linaje .
Sólo hay que notar que TInterfacedObject impementa el conteo de referencias, que da lugar a la recolección automática de basura. En ocasiones podría no ser esto lo que se requiere.

Bye
Responder Con Cita
  #8  
Antiguo 01-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por delphi.com.ar Ver Mensaje
El requisito en sí es que implementes obligatoriamente todos los métodos de la interfaz, y como todas las interfaces heredan de IInterface, si heredas de un objeto que no haya implementado ninguna interfaz, te verás obligado a implementar sus métodos: (QueryInterface, _AddRef y _Release)
Código Delphi [-]type IInterface = interface ['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;


Por eso si queremos crear un objeto simple, heredado de TObject que implemente una interfaz, podemos usar TInterfacedObject como parte de su linaje .

Resumiendo nuevamente, como TMaskEdit es un TComponent puedes hacer exactamente lo que describes.


PD: Dec, creía haberme enredado como de costumbre en la explicación
Gracias Federico. Haz hecho que mi corazón volviera a latir... ya me estaba asustando...

Pues yo venía haciendo como tu dices: heredando de TInterfacedObject para evitar darle las declaraciones. Como la ayuda dice que conviene heredar de él... pues asi le metí. Y asumí que así se debía trabajar siempre.

Esto de estar leyendo de muchos lados hizo una ensalada en mi cabeza.
No digas que tu no te supiste explicar, el tarado soy yo que no puso la debida atención y al hecho de leer de cualquier lado.

Nuevamente gracias, evitaste que tuviera que ir al cardiologo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 01-02-2008
adfa adfa is offline
Miembro
 
Registrado: may 2003
Ubicación: Montevideo-Uruguay
Posts: 119
Poder: 21
adfa Va por buen camino
Gracias a todos.
Saludos
Responder Con Cita
  #10  
Antiguo 01-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por keyboy Ver Mensaje
Sólo hay que notar que TInterfacedObject impementa el conteo de referencias, que da lugar a la recolección automática de basura. En ocasiones podría no ser esto lo que se requiere.

Bye
Muy cierto. Curiosamente hoy estaba investigando estas condiciones cuando llegué a esto.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
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
interfaces luislat40 Varios 2 23-10-2007 03:47:23
Interfaces en C# YaninaGenia .NET 1 18-06-2006 05:14:48
Interfaces... OscarG OOP 9 14-10-2005 13:26:57
Interfaces??? uhilari OOP 3 09-02-2004 16:07:50
Interfaces Legolas Varios 14 17-11-2003 14:39:07


La franja horaria es GMT +2. Ahora son las 18:14:50.


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