Fórum Dúvida sobre Herança e Interface #371577
24/06/2009
0
Daniel Grillo
Curtir tópico
+ 0Posts
25/06/2009
Daniel Grillo
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
25/06/2009
Rodc
Gostei + 0
26/06/2009
Marco Salles
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
29/06/2009
Abysmall
Aproveitando o tópico, gostaria de perguntar o que significa a sequência de caracteres que estão entre os colchetes:
Obrigado.
Gostei + 0
29/06/2009
Marco Salles
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
18/08/2009
Daniel Grillo
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
Clique aqui para fazer login e interagir na Comunidade :)