Dúvida básica interface Delphi
27/11/2019
0
Pessoal, bom dia!
Dado o exemplo:
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
Curtir tópico
+ 0
Responder
Post mais votado
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.
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.
Ricardo
Responder
Mais Posts
28/11/2019
Carlos Leite
((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!
Responder
Clique aqui para fazer login e interagir na Comunidade :)