GARANTIR DESCONTO

Fórum Virtual/Overload/Override #345957

13/09/2007

0

Saudações!!!

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

Roger1976

Responder

Posts

13/09/2007

Diegus

Era bom se vc tivesse um template (Form pai)...

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


Responder

Gostei + 0

13/09/2007

Diegus

Era bom se vc tivesse um template (Form pai)... 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..


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


Responder

Gostei + 0

13/09/2007

Roger1976

Entendi perfeitamente Diegus. Na verdade, eu acabei cometendo um equívoco. Como vc mesmo disse, eu devo declarar este método no form pai como virtual, e nos filhos como override. Corrija-me se estiver errado, o overload seria utilizado se eu tivesse parâmetros? Essa seria a diferença básica entre o overload e o override??

Muito obrigado pela dica.


Responder

Gostei + 0

13/09/2007

Diegus

Entendi perfeitamente Diegus. Na verdade, eu acabei cometendo um equívoco. Como vc mesmo disse, eu devo declarar este método no form pai como virtual, e nos filhos como override. Corrija-me se estiver errado, o overload seria utilizado se eu tivesse parâmetros? Essa seria a diferença básica entre o overload e o override?? Muito obrigado pela dica.


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


Responder

Gostei + 0

13/09/2007

Roger1976

Valeu amigo!


Responder

Gostei + 0

13/09/2007

Raserafim

primeiro esclarecendo as diferenças:

Corrija-me se estiver errado, o overload seria utilizado se eu tivesse parâmetros? Essa seria a diferença básica entre o overload e o override??


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.


Responder

Gostei + 0

13/09/2007

Raserafim

agora para o seu caso.

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.


Responder

Gostei + 0

13/09/2007

Vispo

[b:c132031f0d]raserafim[/b:c132031f0d]

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



Responder

Gostei + 0

13/09/2007

Roger1976

raserafim, eu cometi um equívoco em colocar o método no datamodule, que nem cheguei a fazer o teste.

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.


Responder

Gostei + 0

13/09/2007

Raserafim

vispo,

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);



Responder

Gostei + 0

14/09/2007

Vispo

[b:a80f589a7f]rserafim[/b:a80f589a7f]

show de bola...muito obrigado!!

Abração!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar