Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Herencia e interfaces (https://www.clubdelphi.com/foros/showthread.php?t=52852)

adfa 01-02-2008 18:14:37

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

delphi.com.ar 01-02-2008 18:40:18

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!

dec 01-02-2008 18:48:50

Hola,

Estupenda explicación Federico. :)

Delphius 01-02-2008 19:00:36

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,

adfa 01-02-2008 19:23:19

Federico muchas gracias por tu respuesta.

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

Es valido entonces hacer lo que dice Delphius, verdad?

delphi.com.ar 01-02-2008 19:27:44

Cita:

Empezado por adfa (Mensaje 262736)
¿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 :p.

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 :D

keyboy 01-02-2008 19:32:39

Cita:

Empezado por delphi.com.ar (Mensaje 262762)
Por eso si queremos crear un objeto simple, heredado de TObject que implemente una interfaz, podemos usar TInterfacedObject como parte de su linaje :p.

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

Delphius 01-02-2008 19:37:01

Cita:

Empezado por delphi.com.ar (Mensaje 262762)
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 :p.

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 :D

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,

adfa 01-02-2008 19:39:16

Gracias a todos.
Saludos

Delphius 01-02-2008 19:42:13

Cita:

Empezado por keyboy (Mensaje 262766)
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,


La franja horaria es GMT +2. Ahora son las 17:30:36.

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