Dúvida sobre Herança e Interface

Delphi

24/06/2009

Tem como no Delphi eu criar uma classe que herda de uma outra classe e também que implemente interfaces??


Daniel Grillo

Daniel Grillo

Curtidas 0

Respostas

Daniel Grillo

Daniel Grillo

24/06/2009

O que eu gostaria de fazer é o seguinte:

Criar uma classe TDispositivo. Essa classe seria minha classe mãe. Bom, alguns dispositivos terão um tipo de componente acoplado neste dispositivo. Então eu pensei em criar uma interface chamada IComponente1. Outros dispositivos terão outro tipo de componente acoplados. Então pensei em criar uma outra interface chamada de IComponente2.

E eu gostaria de criar outras classes que fossem da seguinte forma:

TProduto1 = class(TDispositivo, IComponente1)

TProduto2 = class(TDispositivo, IComponente2)

TProduto3 = class(TDispositivo, IComponente1, IComponente2)


Eu consigo fazer isso no Delphi??

Quando eu tento desse jeito acima ele me retorna o seguinte erro:

Undeclared indentifier: QueryInterface

Dai então eu tento colocar o TInterfacedObject da seguinte forma:

TProduto1 = class(TDispositivo, TInterfacedObject, IComponent1)


mas também dá erro. Bom, não tenho experiência com o uso de interfaces. Alguém poderia me mostrar o que eu estou fazendo de errado?
É possível fazer o que eu estou pensando?

Obrigado


GOSTEI 0
Rodc

Rodc

24/06/2009

Se não me engano você tem de implementar no seu código a função QueryInterface().


GOSTEI 0
Marco Salles

Marco Salles

24/06/2009

Tente assim :

unit unMinhasInterfaces;

interface

uses
Dialogs;

Type
 IDispositivo = Interface
   [´{722BCE78-14B3-4E07-AAC0-72ED6AAB3812}´]
   procedure MetodosDispositivo;
 end;

Type
 TDispositivo = Class(TInterfacedObject , IDispositivo)
 public
  procedure MetodosDispositivo;
 end;

Type
 IComponenteA = Interface
  [´{5084E973-3C2A-4310-9070-87EED5E2417E}´]
 procedure MetodosComponenteA;
 end;

Type
 TComponenteA = Class(TDispositivo,IComponenteA)
  public
    procedure MetodosComponenteA;virtual;
  end;


implementation

{ TDispositivo }

procedure TDispositivo.MetodosDispositivo;
begin
Showmessage(´métodos dispositivo´);
end;

{ TComponenentA }

procedure TComponenteA.MetodosComponenteA;
begin
showmessage(´métodos do ComponenteA´);
end;

end.


unit UnFrmPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses unMinhasInterfaces;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
componenteA:IComponenteA;  //Controlde de Referencia .O proprio delphi Cuida
begin
componenteA:=TComponenteA.create;
TComponenteA(componenteA).MetodosDispositivo;
//TComponenteA(componenteA).Free ; //Não se deve fazer Isto
end;

procedure TForm1.Button2Click(Sender: TObject);
var
componenteA:TComponenteA;
begin
componenteA:=TComponenteA.create;
try
componenteA.MetodosDispositivo;
finally
componenteA.Free;
end;
end;


end.



GOSTEI 0
Abysmall

Abysmall

24/06/2009

Olá,

Aproveitando o tópico, gostaria de perguntar o que significa a sequência de caracteres que estão entre os colchetes:

IDispositivo = Interface [´{722BCE78-14B3-4E07-AAC0-72ED6AAB3812}´] procedure MetodosDispositivo; end;


Obrigado.


GOSTEI 0
Marco Salles

Marco Salles

24/06/2009

Bem , esta sequencia de caracteres é o que se chama de GUID
Tipo um Identificador Único
Para obte-la dentre outros meios , no seu Codigo Editor do Delphi
digite simultaneamente Ctrl+Shift+G que vc obtera esta Sequencia e
será Unica Tantas Vezes Vc Digitar Ctrl+Shift+
Para que serve ??A interface foi introduzida no Delphi para dar Suportes
a objetos COM . Porém nen toda Interface esta Relacionada a Objetos COM
Nos nossos Aplicativos se usarmos Interface , poderemos omitir esta sequencia porém para[b:1155e135f5] funcionar Corretamente [/b:1155e135f5], cada Interface exige
esta Identificação numérica ( então é recomendável que se defina uma Sequencia )

Exemplo
A interface não suporta o Operador Is... Com saber se um determinado
Objeto Implementa uma determinada Iterface ???

Existe o Método sobrecarregado [b:1155e135f5]Supports[/b:1155e135f5] e tb o [b:1155e135f5]QueryInterface[/b:1155e135f5] porém eles exigem este Identificador

Para simplificar Tente por exemplo

procedure TForm1.Button1Click(Sender: TObject); 
Const
IDDisp:TGuid = ´{722BCE78-14B3-4E07-AAC0-72ED6AAB3812}´;
var 
componenteA:IComponenteA;  //Controlde de Referencia .O proprio delphi Cuida 
begin 
componenteA:=TComponenteA.create as IComponeneteA; 
  if supports(ComponenteA,IDDisp) then 
//Poderia tb if supports(ComponenteA,Idispositivo) then
    TComponenteA(componenteA).MetodosDispositivo; 
//TComponenteA(componenteA).Free ; //Não se deve fazer Isto 
end;



GOSTEI 0
Daniel Grillo

Daniel Grillo

24/06/2009

Caro Marco Sales,

A resposta é essa mesmo. Eu consegui resolver antes de sua resposta. Eu não recebi notificação de sua resposta por isso a demora de meu feedback.

Obrigado


GOSTEI 0
POSTAR