Dúvida sobre Herança e Interface
Tem como no Delphi eu criar uma classe que herda de uma outra classe e também que implemente interfaces??
Daniel Grillo
Curtidas 0
Respostas
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:
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:
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
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
24/06/2009
Se não me engano você tem de implementar no seu código a função QueryInterface().
GOSTEI 0
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
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:
Obrigado.
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
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
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
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
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