Dúvida básica interface Delphi

Orientação a Objetos

Delphi

Interface

27/11/2019

Pessoal, bom dia!

Dado o exemplo:

type
  ICliente = interface
   function teste():boolean;
end;

TCliente = class(TInterfacedObject, ICliente)
  private
       Fnome: string;
  public
       function teste():boolean; // metodo da interface
       function teste2():boolean; // metodo qualquer da classe Cliente
  published  
   property nome: string read Fnome write Fnome;
  
end;

//codigo em outra unit qualquer
var cliente:ICliente;
begin
  cliente := TCliente.Create;
  cliente.teste( ); //Ok, funciona. 
  cliente.nome := 'João'; // dá erro dizendo que não tenho essa propriedade em ICliente.
  cliente.teste2();// dá erro tb.
end;

Minha pergunta é a seguinte:
Como eu consigo criar uma classe que implemente uma interface mas que me deixe usar metodos e propriedades adicionais da classe que não existem na interface? Sei que no java consigo fazer isso, mas no Delphi a classe sempre tem que ser 100% fiel à interface?

Obrigado.
Carlos Leite

Carlos Leite

Curtidas 0

Melhor post

Ricardo

Ricardo

27/11/2019

A resposta para sua pergunta é "Não."

Uma interface não limita os atributos ou métodos que uma classe pode ter.
Ela é apenas te obriga a implementar todos os seus métodos, mas a classe pode ter outros atributos adicionais

Exemplo

type
ICliente = interface
function teste():boolean; /// A classe precisa ter este método obrigatoriamente
end;

TCliente = class(TInterfacedObject, ICliente) /// ---> TCliente assumiu um compromisso com ICliente, e precisará implementar todos os seus métodos.
///// Cuidado: Se amanhã alguém criar um novo método na Interface ICliente, você será forçado a implementar este método na classe
private
Fnome: string;
public
function teste():boolean; // metodo da interface
function teste2():boolean; // metodo qualquer da classe Cliente --> Isso funciona sem problemas
published
property nome: string read Fnome write Fnome;

end;


Benefícios da interface

Uma interface permitirá que você trabalhe em uma equipe grande, sem que todos os indivíduos conheçam todas as regras de negócio da classe TCliente.
Por exemplo, eu sou responsável por Teste: Boolean begin meuCodigoRetorna True end;
Você não precisa conhecer meu método Teste, mas você pode usar ele tranquilamente através da interface


Como usar

var Cliente: ICliente; ( E não TCliente)

begin
Cliente := TCliente.Create; (Aqui sim a instância da classe)

Cliente.Teste; /// sempre vai funcionar;

Cliente.Teste2; ///Não funciona assim, mas tem um truque escondido

((Cliente) as TCliente).Teste2; //Isso funciona perfeitamente.

Espero ter ajudado.
GOSTEI 1

Mais Respostas

Carlos Leite

Carlos Leite

27/11/2019


((Cliente) as TCliente).Teste2; //Isso funciona perfeitamente.


Esse é o PDG (Pulo Do Gato rs).
Sua explicação foi sensacional. Muito obrigado por responder a dúvida e ainda dar um bônus explicando as vantagens da interface.
Eu não sabia que precisava fazer esse cast para usar as outras propriedades e métodos.
Obrigado!
GOSTEI 0
POSTAR