|
Usuários |
|
32 Usuários Online
|
|
[Artigos]
Por que Interfaces? |
Publicado por welter : Quarta, Setembro 08, 2004 - 11:17 GMT-3 (4838 leituras)
1 Comentário Enviar para um amigo Versão para impressão
|
Uma pergunta frequentemente formulada pelas pessoas que conversam comigo é o porquê do uso de interfaces. Então tentarei abordar neste artigo um resumo prático do uso de Interfaces e uma das varias formas de tornar seu uso muito útil em nossos aplicativos. Lembrando sempre da classica frase:
"Existem mil maneiras de preparar Neston", pois como todos sabem, sempre há uma forma diferente de enchergar a mesma coisa e uma possivelmente será melhor que a outra.
Mas vamos ao que interessa.
Vamos traçar um quadro onde tenho um sistema e nesse sistema existe a possibilidade do cliente comprar e pagar seus débitos ao final do mês. Tudo funcionava as mil maravilhas, mas então um novo cliente decidiu que o calculo do montante da divida ao final do mês, deveria dar um desconto de 10% nas comprar dos clientes efetuadas até o dia 10. Até aqui não é nada anormal, pois todos os dias nos deparamos com coisas fora do comum, mas a pergunta é: Como colocar este calculo no meu sistema sem perder o que eu tinha e sem ter de encher meu sistema de IF´s e pior ainda, e se outro cliente tiver outra nescessidade neste mesmo calculo. Bom, neste caso podemos usar uma simples interface e separar o calculo do coração da rotina e carregar o calculo desejado na hora certa, então os senhores me perguntam de que maneira eu poderia fazer isto e eu respondo, MUITO SIMPLES.
Vamos Criar uma Interface que atenda meus propósitos:
ICalculo = interface(IInterface)
procedure SomaValor(Valor: Real; Data: TDateTime);
function Apurado: Real;
end;
Neste exemplo temos uma função que ira acumular os valores e uma função que ira retornar o total apurado da soma de todos os lançamentos.
Vamos criar a Classe Normal que será a responsável pelo cálculo normal.
TCalculoNormal = class(TInterfacedObject, ICalculo)
private
fTotal: Real;
public
constructor Create;
procedure SomaValor(Valor: Real; Data: TDateTime); virtual;
function Apurado: Real;
end;
Observe que o Método SomaValor possui a diretiva Virtual na sua declaracao, isto significa que esta classe pode ser herdada por um outro objeto e alterado, veja abaixo como fica a classe descendida;
TCalculoAlterado = class(TCalculoNormal, iCalculo)
procedure SomaValor(Valor: Real; Data: TDateTime); override;
end;
No exemplo acima, nos estamos dizendo que TCalculoAlterado é igual a TCalculoNomal, mas que o método SomaValor será reescrito, já o método Apurado será usado o mesmo que foi escrito na classe ancestral;
Com isto basta criar em nossa rotina uma variável do Tipo ICalculo e criar a classe normal ou alterada dentro dela para ser usada:
var
Calculo: iCalculo;
begin
case Metodo.ItemIndex of
0: Calculo := TCalculoNormal.Create;
1: Calculo := TCalculoAlterado.Create;
end;
Agora basta percorrer os registros e enviar para a classe e no final obter o resultado pelo método APURADO.
Para facilitar a compreenção esta disponivel na area de Download do site do projeto sultan um exemplo do uso deste recurso.
Abração a todos.
por
Marcelo Welter
Coordenador do Projeto Sultan
www.welter.pro.br/sultan
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
por: cadimus : Nov 26, 2004 - 11:48 (Informações sobre o membro | Enviar uma mensagem)
http://
|
Caro amigo Marcelo, neste artigo você mostra de maneira clara como utilizar interfaces, porém, já pedindo perdão por minha ignorância, não consegui entender em que realmente vai ajudar a interface, considerando o exemplo que vc colocou.
A minha dúvida realmente é: Qual a diferença entre eu utilizar uma classe abstrata e uma interface??? O que me parece é que utilizar a interface é um pouco redundante!!!!
Por gentileza me esclareça este ponto!!!!
[]s
Marcello
|
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|