[DELPHI] Como codificar para instanciar uma Inteface sem saber quem irá implementa-lá.

Delphi

21/01/2018

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

Vinicius Diniz

Curtidas 0

Respostas

Felipe Morais

Felipe Morais

21/01/2018

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:

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!
GOSTEI 0
POSTAR