GARANTIR DESCONTO

Fórum redeclarando um método numa classe derivada... #241387

05/07/2004

0

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

Responder

Posts

05/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

05/07/2004

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)


Responder

Gostei + 0

05/07/2004

Paulo_amorim

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é+


Responder

Gostei + 0

05/07/2004

Djjunior

creio que não.

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


Responder

Gostei + 0

05/07/2004

Marcelo Saviski

[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


Responder

Gostei + 0

05/07/2004

Paulo_amorim

[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é+


Responder

Gostei + 0

05/07/2004

Marcelo Saviski

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,


Responder

Gostei + 0

05/07/2004

Beppe

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.


Responder

Gostei + 0

23/07/2004

Vitor Rubio

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

Grato!


Responder

Gostei + 0

23/07/2004

Beppe

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.


Responder

Gostei + 0

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

Aceitar