Fórum [DELPHI] Como codificar para instanciar uma Inteface sem saber quem irá implementa-lá. #590735
21/01/2018
0
Meu exemplo não é muito prático, mas sim mais a nível acadêmico.
Por exemplo eu tenho um software que estou desenvolvendo, e Em determinado momento surgiu a necessidade de usar interfaces. Porém ai veio a dúvida como eu posso codificar para instanciar uma interface sem saber quem irá implementa-lá.
Exemplo:
Não sei se isso é pratico dentro do Delphi caso não seja desculpem minha ignorância.
Por exemplo eu tenho um software que estou desenvolvendo, e Em determinado momento surgiu a necessidade de usar interfaces. Porém ai veio a dúvida como eu posso codificar para instanciar uma interface sem saber quem irá implementa-lá.
Exemplo:
type []; IProduct = Interface SetName(Value: String); SetPrice(Value: Double); SetStock(Value: Double); function GetName: String; function SetPrice: Double; function SetStock: Double; property Name: String read GetName write SetName; property Price: Double read GetPrice write SetPrice; ... // Quando instancio no form eu ainda não sei que irá implementar a interface ... FProdutct : IProduct; ... procedure Example (Value : Variant); begin FProduct := ???????.Create; end;
Não sei se isso é pratico dentro do Delphi caso não seja desculpem minha ignorância.
Vinicius Diniz
Curtir tópico
+ 0
Responder
Posts
25/01/2018
Felipe Morais
Boa noite, Vinícius
Quando uma Interface é criada ela vai definir o escopo de negócio. Em outras palavras, se eu defino uma Interface com uma assinatura de método, estou definindo que a classe que implementa esta Interface (seja qualquer classe) deverá também implementar o método (mesma assinatura, parâmetros e tipos de parâmetro e retorno). Vamos definir uma Interface bem simples:
Aqui eu defini uma Interface que possui dois métodos: MetodoUm e MetodoDois. O primeiro é simples e o segundo possui um parâmetro string. Isto é uma definição negocial, onde qualquer classe que for implementar a Interface IModeloInterface obrigatoriamente precisa também implementar os seus métodos (MetodoUm e MetodoDois) exatamente como foram assinados.
Até aqui qualquer classe pode implementar esta Interface, ela não sabe quem irá implementá-la ou não. Vamos criar uma classe que implemente esta Interface:
Perceba que na declaração da classe dois parâmetros foram citados: o primeiro (TInterfacedObject) define que esta classe está implementando uma Interface, e o segundo é o nome da Interface que está sendo implementada (IModeloInterface). Assim, a classe TClasseUm implementa a Interface IModeloInterface sem a Interface "ter conhecimento prévio disto". Espero ter ajudado, qualquer dúvida pode postar que ajudamos você.
Abraço!
Quando uma Interface é criada ela vai definir o escopo de negócio. Em outras palavras, se eu defino uma Interface com uma assinatura de método, estou definindo que a classe que implementa esta Interface (seja qualquer classe) deverá também implementar o método (mesma assinatura, parâmetros e tipos de parâmetro e retorno). Vamos definir uma Interface bem simples:
type
IModeloInterface = interface
procedure MetodoUm;
procedure MetodoDois(AParam: string);
end;
Aqui eu defini uma Interface que possui dois métodos: MetodoUm e MetodoDois. O primeiro é simples e o segundo possui um parâmetro string. Isto é uma definição negocial, onde qualquer classe que for implementar a Interface IModeloInterface obrigatoriamente precisa também implementar os seus métodos (MetodoUm e MetodoDois) exatamente como foram assinados.
Até aqui qualquer classe pode implementar esta Interface, ela não sabe quem irá implementá-la ou não. Vamos criar uma classe que implemente esta Interface:
TClasseUm = class(TInterfacedObject, IModeloInterface)
procedure MetodoUm;
procedure MetodoDois(AParam: string);
end;
implementation
{ TClasseUm }
procedure TClasseUm.MetodoDois(AParam: string);
begin
// Código
end;
procedure TClasseUm.MetodoUm;
begin
// Código...
end;
Perceba que na declaração da classe dois parâmetros foram citados: o primeiro (TInterfacedObject) define que esta classe está implementando uma Interface, e o segundo é o nome da Interface que está sendo implementada (IModeloInterface). Assim, a classe TClasseUm implementa a Interface IModeloInterface sem a Interface "ter conhecimento prévio disto". Espero ter ajudado, qualquer dúvida pode postar que ajudamos você.
Abraço!
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)