redeclarando um método numa classe derivada...

Delphi

05/07/2004

Por favor, tirem-me esta dúvida?

o que se obtrem quando um metdodo e redecarado numa classe derivda sem que se utilize a palavra-chave OVERRIDE?

dois metodos diferentes, mas com o mesmmo nome ou isto nao pode ococorrer, o compilador acusara erro?

Grata.


Rejane

Rejane

Curtidas 0

Respostas

Paulo_amorim

Paulo_amorim

05/07/2004

Olá

Creio que ele dá erro quando você chama o método...mas nãotenho certeza...

Faça um teste e veja o comportamento :wink:

Até+


GOSTEI 0
Djjunior

Djjunior

05/07/2004

em vez de Override utilize Reintroduce
os parametros passados pelo segundo método devem ser de tipos diferentes do primeiro (de uma olhada no help para mais detalhes)


GOSTEI 0
Paulo_amorim

Paulo_amorim

05/07/2004

em vez de Override utilize Reintroduce os parametros passados pelo segundo método devem ser de tipos diferentes do primeiro (de uma olhada no help para mais detalhes)


Olá

Agora fiquei curioso com a situação
Se vc usar reintroduce o método pai não precisa ser virtual ou dynamic?

Até+


GOSTEI 0
Djjunior

Djjunior

05/07/2004

creio que não.

a propósito dê uma olhada no help também em overload


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

05/07/2004

[quote:3c278c44aa=´djjunior´]em vez de Override utilize Reintroduce os parametros passados pelo segundo método devem ser de tipos diferentes do primeiro (de uma olhada no help para mais detalhes)


Olá

Agora fiquei curioso com a situação
Se vc usar reintroduce o método pai não precisa ser virtual ou dynamic?

Até+[/quote:3c278c44aa]

quando usa virtual ou dynamic, se vc redefinir um método, as rotinas da classe que vc herdou vão chamar o método com o codigo que vcreescreveu, com reintroduce vc só reutiliza o nome, os metodos da classe pai continuam valendo


GOSTEI 0
Paulo_amorim

Paulo_amorim

05/07/2004

[quote:220bcf903f=´Marcelo Saviski´]quando usa virtual ou dynamic, se vc redefinir um método, as rotinas da classe que vc herdou vão chamar o método com o codigo que vcreescreveu, com reintroduce vc só reutiliza o nome, os metodos da classe pai continuam valendo[/quote:220bcf903f]

Olá

De fato, faz sentido jah que os parâmetros são outros... não tinha pensado nisso. Obrigado

Aproveitando o tópico:
Pode-se colocar parâmetros opcionais num metodo?
Tipo
procedure MeuMetodo( s: String; i: Integer);

para chamá-lo eu preciso
MeuMetodo ( s, i);

tem como deixar um parametro opcional, de modo que a chamada
MeuMetodo(s); 


(claro, sem usar overload...)

Até+


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

05/07/2004

procedure MeuMetodo( s: String; i: Integer[b:0f23496810] = 0[/b:0f23496810]);

seria isso? assim se vc não informar o [b:0f23496810]i[/b:0f23496810] ele fica [b:0f23496810]0[/b:0f23496810] por padrão, mas ai sempre tem que ser nos últimos parametros,


GOSTEI 0
Beppe

Beppe

05/07/2004

Espero não complicar ainda mais a situação. :wink:

[b:fdf54c61ba]virtual[/b:fdf54c61ba], [b:fdf54c61ba]dynamic[/b:fdf54c61ba]: Permite que o método seja reimplementado numa classe descendente. O método que será evocado é o método implementado pela(ou herdado na) classe da instância.

[b:fdf54c61ba]override[/b:fdf54c61ba]: O método redefine um método(virtual ou dynamic) de uma classe ancestral, este último não será mais acessível ao usuário(consumidor da classe).

Voltando à dúvida da rejane, quando o método é declarado sem override, e existe um método de mesmo nome numa classe ancestral, um novo método é adicionado à classe, em vez de substituir um existe. E a diferença, na prática?

Depende do tipo do objeto em que ocorre a chamada:

TClasseA = class
  procedure DigaOla; virtual;
end;

TClasseB = class(TClasseA)
  procedure DigaOla; override;
end;

procedure TClasseA.DigaOla;
begin
  ShowMessage("Não pode me obrigar!");
end;

procedure TClasseB.DigaOla;
begin
  ShowMessage("Olá!");
end;

...
var
  A: TClasseA;
begin
  A := TClasseB.Create;
  A.DigaOla;
end;


A mensagem ´Olá´ será exibida, pq o objeto A é do tipo TClasseB(em tempo de execução, é o que conta). Já se override tivesse sido omitido em DigaOla de TClasseB, uma outra mensagem será exibida, sendo considerado o objeto do tipo TClasseA, e ignorando a implementação em B.


GOSTEI 0
Vitor Rubio

Vitor Rubio

05/07/2004

Aproveitando o embalo: Qual a diferença entre virtual e dynamic???

Grato!


GOSTEI 0
Beppe

Beppe

05/07/2004

Para o programador? Nenhuma diferença em 99¬ dos casos. A diferença está na forma em que o código gerado chama estas funções. No caso de chamá-las em assembly, ou usar TypeInfo, então vc terá que diferenciá-las, como consta no Help do Delphi.


GOSTEI 0
POSTAR