redeclarando um método numa classe derivada...
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.
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
Curtidas 0
Respostas
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é+
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
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)
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
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
05/07/2004
creio que não.
a propósito dê uma olhada no help também em overload
a propósito dê uma olhada no help também em overload
GOSTEI 0
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
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
para chamá-lo eu preciso
tem como deixar um parametro opcional, de modo que a chamada
(claro, sem usar overload...)
Até+
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
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,
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
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:
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.
[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
05/07/2004
Aproveitando o embalo: Qual a diferença entre virtual e dynamic???
Grato!
Grato!
GOSTEI 0
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