Fórum redeclarando um método numa classe derivada... #241387
05/07/2004
0
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
Curtir tópico
+ 0Posts
05/07/2004
Paulo_amorim
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
05/07/2004
Djjunior
os parametros passados pelo segundo método devem ser de tipos diferentes do primeiro (de uma olhada no help para mais detalhes)
Gostei + 0
05/07/2004
Paulo_amorim
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
05/07/2004
Djjunior
a propósito dê uma olhada no help também em overload
Gostei + 0
05/07/2004
Marcelo Saviski
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
05/07/2004
Paulo_amorim
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
05/07/2004
Marcelo Saviski
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
05/07/2004
Beppe
[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
23/07/2004
Vitor Rubio
Grato!
Gostei + 0
23/07/2004
Beppe
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)