override overload virtual ... Duvidas
27/03/2006
0
type TAnimal =class private function Voice:String;Virtual; end;
type TDog =Class(TAnimal) private function voice:String;Overload; function Voice(indice:integer):String;Overload; end;
type TCat=Class(TAnimal) function voice:String;Override; end;
e na parte implementation:
{ TAnimal } function TAnimal.Voice: String; begin result:=´Sou um Animal´; end;
{ TDog } function TDog.voice: String; begin result:=´Sou um cachorro´; end; function TDog.voice(indice: integer): String; begin case indice of 0:result:=´Sou um cachorro manso´; 1:result:=´Sou um cachorro bravo´; end; end;
{ TCat } function TCat.voice: String; begin result:=´Sou um gato´; end;
declarei ainda uma variavel MyAnimal , logo abaixo da secçao implementation
implementation {$R *.dfm} var MyAnimal:TAnimal;
Nesse formulario tenho cinco botoes cujo os nomes são bem sujestivos :
procedure TForm1.CriarAnimalClick(Sender: TObject); begin MyAnimal:=TAnimal.Create; end;
procedure TForm1.CriarCachorroClick(Sender: TObject); begin MyAnimal:=TDog.Create; end;
procedure TForm1.CriarGatoClick(Sender: TObject); begin MyAnimal:=TCat.Create; end;
//Chama o metodo
procedure TForm1.metodoVoiceCachorroClick(Sender: TObject); begin showmessage(Tdog(MyAnimal).voice); MyAnimal.Free; end;
/chama o método
procedure TForm1.MetodoVoiceCatClick(Sender: TObject); begin showmessage(Tcat(MyAnimal).voice); MyAnimal.Free; end;
Ate ai tudo bem ...
Executar o MetodoVoiceCatClick sem ter instanciado o Objeto..Isto é , sem ter ´criado´ o MyAnimal :arrow:
[b:3b5de355dc]Obtenho um ERRO... De Acesso ... Como deveria[/b:3b5de355dc]
[b:3b5de355dc]a dúvida é... Ao executar evento Onclick do botão metodoVoiceCachorroClick eu não obtenho nenhum ERRO ???? parece que esse métodos ja estão alocados na memoria do computador ????
eu não precisei instanciar a variavel MyaNIMAL para executar esse métodos da Calsse TDOG ??? [/b:3b5de355dc]
[color=darkblue:3b5de355dc][b:3b5de355dc]porque dois pesos e duas medidas ??? [/b:3b5de355dc][/color:3b5de355dc]
Obrigado...
Marco Salles
Posts
27/03/2006
Massuda
Alguns erros que podem ocorrer...[list:c79190befb][*:c79190befb]Executar MetodoVoiceXxxClick sem ter chamado CriarXxxClick deve dar um AV[*:c79190befb]Executar MetodoVoiceXxxClick duas vezes seguidas [i:c79190befb]pode[/i:c79190befb] dar um AV[*:c79190befb]Executar CriarXxxClick seguindas vezes [i:c79190befb]pode[/i:c79190befb] deixar memória sem liberar[/list:u:c79190befb]
Com relação à classe TDog, nela você redeclarou o método Voice de modo que esse método não é mais virtual (faltou um override). Como esse método não é mais virtual, ele passa a ser um endereço fixo na tabela de métodos da classe, de modo que, na minha opinião (não testei) você não depende de ter um objeto para acessar a classe.
27/03/2006
Marco Salles
Quem criou tudo foi eu..
Fiz isto propositalmente....
é o que tudo indica , mas é estranho, porque supondo que a classe tenha outros métodos virtuais ou overrides , teremos nesta classe , algumas definiçoes fixas e outra que serão criadas quando o objeto for instanciado ???
Eu testei e é sobre isto que levanto esta dúvida
[b:53ea0b122b]Sera , <tb não testei> que se tiver pelo menos um método Virtual(Ou Override) nesta Classe(TDog) seje suficiente para que todos os outros métodos , não sejam mais carregados na memória (com endereço fixo)
?????????[/b:53ea0b122b]
27/03/2006
Massuda
[quote:2df5eb22bd=´Marco Salles´]...se tiver pelo menos um método Virtual(Ou Override) nesta Classe(TDog) seje suficiente para que todos os outros métodos , não sejam mais carregados na memória (com endereço fixo)?[/quote:2df5eb22bd]Todos os métodos estão na memória e tem endereço fixo. O que acontece é que cada objeto tem uma tabela que diz qual método dinâmico/virtual deve ser usado; para os métodos estáticos (sejam eles da classe ou do objeto) essa tabela não é necessária. No seu caso, como você fez Voice ser um método estático não está sendo necessário usar a tabela de métodos virtuais não precisa ser consultada.
Agora, Delphi tem alguns furos na implementação de POO... um deles é esse que seu código está demonstrando, ou seja, acessar um método estático através de um objeto nil. Outras linguagens não permitem isso e conceitualmente esse é o comportamento correto.
27/03/2006
Ipc$
function Voice: String;
class function Voice: String;
Clique aqui para fazer login e interagir na Comunidade :)