Fórum Virtual/Overload/Override #345957
13/09/2007
0
Gostaria de esclarecer uma dúvida com vocês. Imaginem um sistema que possua um cadastro de clientes, um de fornecedores, um de produtos e um de funcionários, por exemplo. Suponhamos que terão um método chamado GravaRegistro. Vejam, os quatro cadastros usariam este método. Seria correto declará-lo num datamodule como virtual (procedure GravaRegistro; virtual) e nas units dos cadastros declará-lo como overload ou override (procedure GravaRegistro; override ou overload;)? Ou seria melhor criar este método em cada unit sem usar essas palavras reservadas?
[]´s
Rogério
Roger1976
Curtir tópico
+ 0Posts
13/09/2007
Diegus
Neste form pai os métodos com Virtual... com ou sem alguma coisa programada no procedimento.
Os forms q herdarem deste pai... vai ter q ter o método.. mas no lugar de Virtual... o Override para sobrescrever o método..
Gostei + 0
13/09/2007
Diegus
Ah... esqueci..
O overload é usado quando existem dois procedimentos ou funções com o mesmo nome... mas com parametros diferentes... quando vc coloca um overload na frente destes procedimentos com mesmo nome.. .na implementação... quando vc for chamar este metodo q tem um mesmo nome... irá se adaptar de acordo com os parametros que vc colocou...
exemplo:
procedure soma(x, y , z: integer): overload
var
soma : integer;
begin
soma := x + y + x;
showmessage(inttostr(soma));
end;
procedure soma (x, y : integer) : overload
var
soma : integer;
begin
soma := x + y;
showmessage(inttostr(soma));
end;
procedure button1.click...
begin
soma(1, 5, 4); //chama o primeiro procedimetno
soma (1 ,2); // chama o segundo
end;
tentei passar... se não entender eh soh falar..
Gostei + 0
13/09/2007
Roger1976
Muito obrigado pela dica.
Gostei + 0
13/09/2007
Diegus
Isso ae...
[b:06135da208]Se eu não me engano [/b:06135da208]eh isso ai... para usar o Overload devemos ter um método com mesmo nome... e com parametros diferentes..
Se eu estiver errado alguem pode corrigir...
E a diferença básica entre overload e override é:
Overload para acionar um método com assinaturas diferentes ... q nem no exemplo do somar q eu fiz...
e o Override seria utilizado para sobrescrever um método virtual...
Qualquer coisa estamos ai...
Gostei + 0
13/09/2007
Roger1976
Gostei + 0
13/09/2007
Raserafim
não é bem assim.
o OVERLOAD significa sobrecarregado. é utiliado quando vc quer declarar mais de um método (procedimento ou função) com o mesmo nome. então o que irá diferenciar a qual método vc está se referindo serão os parâmetros, tanto na quantidade quanto no tipo, não no nome. mas você pode ter um sem parâmetro e outro com parâmetro.
o OVERRIDE significa sobreposição e é utilizado quando você tem um método em uma classe pai, e deseja que o método com o mesmo nome declarado na classe filha disparado.
ex:
vc tem o form1 com um botão que chama o método MostrarTeste (este método vc coloca um showmessage para eibir por exemplo o nome carro).
se vc criar o form2 herdado (polimorfismo) do form1 então este mesmo botão vai aparecer no form2. clicando nele vc vai receber a mesma mensagem que apareceu quando clicou no form1.
mas se vc quiser redeclarar no form2 o código deste método MostrarTeste, para eibir a mensagem moto, então vc declara no form pai como Virtual e no filho como Override.
e se vc quiser que dentro do método reescrito no form2 seja chamado o método do form1 é só utiliar a palavra Inherited.
vc tem ainda uma outra palavra Abstract. essa é utiliada junto com a Virtual (Virtual; Abstract;). a função dela é para que seja possível definir um método na classe pai e não implementar nenhum código. o código será implementado apenas nas classes filhas.
Gostei + 0
13/09/2007
Raserafim
o que se encaia para o seu caso é o override.
mas perceba o seguinte:
onde está essa procedure GravaRegistro nos cadastros de clientes, fornecedores, etc... estão no form ou no datamodule correspondente ao form?
se esta procedure estiver no form então vc teria que ter um form padrão que seria o pai destes outros forms.
então vc declararia no form pai como Virtual e nos forms filhos (clientes, fornecedores...) como override.
se esta procedure está nos datamodules cadastros de clientes, fornecedores, etc... então vc teria que ter um datamodule padrão (pai) do qual os outros herdariam.
você não pode faer como está pensado. colocar em algum lugar aleatório.
Virtual tem que ficar na classe pai e Override nas classes filhas.
se vc não planejou a sua aplicação assim então vc não conseguirá utilizar.
e se os códigos são implementados todos apenas nos filhos então vc pode utiliar o Virtual; Abstract;
mas nos dois casos só terá utilidade se no form pai ou datamodule pai vc vai implementar código genérico que vai se referir ao método pai.
Gostei + 0
13/09/2007
Vispo
Eu tenho um problema parecido, é o seguinte:
Tenho uma classe pai, chamada TClasseConsulta, a qual é usada para fazer todas as consultas do meu sistema (Clientes, Produtos, etc...) essa classe tem um método Deletar. Nas classes filhas, eu utilizo o Override para alterar o método quando necessário. Até ai tudo tranquilo.
Meu form principal, ficou mais ou menos assim:
Type TConsultaClientes = Class(TClasseConsulta) public procedure Deletar(); override; end; Type TConsultaProdutos = Class(TClasseConsulta) public procedure Deletar(); override; end;
O problema está aqui, eu quero fazer um método genérico para chamar essas consultas, passando como parâmetro, a classe desejada. Existe a possibilidade de criar um parâmetro, que aceite tanto a TConsultaClientes como a TConsultaProdutos? Tipo assim:
procedure ChamaConsulta(ClasseConsulta: ????)
Gostei + 0
13/09/2007
Roger1976
Estou desenvolvendo um exemplo para que aprenda técnicas que serão utilizadas em futuras aplicações. Num projeto onde têm-se telas de cadastro, dependendo da situação, o correto é criar um form padrão ou form pai. O método GravaRegistro é declarado no form pai, mas a sua implementação é feita nos forms filhos.
Agora ficou mais claro os conceitos de overload e override, pelas suas explicações, diríamos que uma coisa é uma coisa e outra coisa é outra coisa (rs rs rs).
Eu fiz os testes criando telas de cadastro de clientes, fornecedores, produtos, funcionários, e os resultados estão dentro do esperado.
Muito obrigado pelas informações.
Gostei + 0
13/09/2007
Raserafim
da certo sim.
já que tanto TConsultaClientes como a TConsultaProdutos herdam da mesma classe TClasseConsulta.
a sua declaração deve ser mais ou menos assim né?:
type TClasseConsulta = class public procedure Deletar(); virtual; abstract; end; Type TConsultaClientes = Class(TClasseConsulta) public procedure Deletar(); override; end; Type TConsultaProdutos = Class(TClasseConsulta) public procedure Deletar(); override; end;
crie a procedure ChamaConsulta:
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ChamaConsulta(Classe: TClasseConsulta);
end;crie as variáveis:
var Form1: TForm1; ConsultaProdutos: TConsultaProdutos; ConsultaClientes: TConsultaClientes;
no OnCreate do form instancie as duas variáveis:
procedure TForm1.FormCreate(Sender: TObject); begin ConsultaProdutos := TConsultaProdutos.Create; ConsultaClientes := TConsultaClientes.Create; end;
chame a procedure:
ChamaConsulta(ConsultaClientes);
Gostei + 0
14/09/2007
Vispo
show de bola...muito obrigado!!
Abração!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)