Clayton Bonelli wrote: > Oi Joao, > > Se voce procurar em qualquer livro de programacao orientada por objetos vai > encontrar a palavra "referencia" e nao "ponteiro". Nao eh a toa que isto > ocorre, porque as linguagens de programacao, vou citar Delphi/Java, tem > liberdade para internamente decidir como serah feito o acesso a um objeto. > Se uma variavel definida, como no exemplo abaixo: > > var x : TButton; > > fosse apenas um ponteiro, isto significaria que dentro da variavel "x" > estaria fisicamente o endereco de onde a instancia (o objeto) da TButton > esta na memoria. Ou seja: > > [x] ------------> botao > > A variavel "x" estaria apontado para as informacoes (atributos/metodos) do > botao. > > Na verdade, no caso do Delphi, a representacao dos "apontamentos" seria algo > parecido com o mostrado abaixo: > > [x]--------[uma estrutura em memoria]-------->[outra estrutura em > memoria]-----......----> botao > > A variavel "x" esta apontado para o endereco de uma estrutura em memoria, > que por sua vez possui o endereco de outras estruturas de memoria, sendo > somente no final desta cadeia de apontamentos eh que as informacoes do botao > podem ser encontradas. > > Ao usar o termo "referencia" os livros entendem que as implementacoes das > linguagens de programacao tem toda a liberdade de usarem outras formas de > acesso aos objetos, nao soh a forma de acesso direto (se fosse acesso direto > seriam chamados de ponteiros). Por exemplo, ainda na linguagem Delphi: > Quando um objeto eh criado, diversas estruturas de memoria sao criadas para > representar este objeto. Uma destas estruturas eh a VMT (Virtual Method > Table) que contem o endereco de todos os metodos da classe TButton (vou > continuar usando o botao como exemplo mas vale para as demais classes) e o > endereco de todos os metodos das classes ancestrais de TButton. Outra destas > estruturas contem o endereco dos atributos de instancia. Outra estrutura > estrutura teria o endereco dos atributos de classe, e por ai vai, formando > uma cadeia de estruturas de memoria. > > Na linguagem Java, por outro lado, uma variavel definida como: > > Button x; > > Internamente a variavel "x" nao tem o endereco de memoria de nenhuma > informacao (no caso o objeto botao). Na verdade, eh apenas um > indentificador, porque os enderecos de memoria sao tratados e resolvidos > internamente pela VM (maquina virtual) do Java. Logo, no caso do Java a > variavel "x" nao eh sequer um ponteiro, porque nem possuir um endereco de > memoria ela possui. A variavel "x" eh uma referencia. > > Por causa da possibilidade das implementacoes das linguagens, terem a total > liberdade de decidirem como vao representar internamente o acesso aos > objetos, eh que os livros usam as palavras "Referencia a objeto" e nao > ponteiro. Usar o termo "ponteiro" implicaria que todas as definicoes de > variaveis como : > > var x : TButton; // delphi > Button x; // java > > obrigariam as linguagens a colocar dentro de "x" o endereco de memoria das > informacoes dos objetos. Os "ponteiros" do delphi, por exemplo, nao possuem > o endereco direto da informacao de um botao, mas o endereco de uma estrutura > na memoria que apontam para diversas outras estruturas que somadas vao > compor o objeto botao. Soh isso desclassifica a variavel "x" de ser chamada > de ponteiro, porque ela nao aponta diretamente para onde a informacao > (atributos e metodo) do objeto esta na memoria. > > Experimente tentar executar o codigo abaico e veja se o compilador nao irah > "berrar": > > procedure TForm1.Button1Click(Sender: TObject); > var > s : string; > begin > s := TButton(Button1^).Name; > end; > > Porque ele nao permite a deferencia acima (Button1^.Name)? Se "Button1" > fosse um ponteiro nao deveria permitir este tipo de acesso ao atributo > "Name" ? Afinal, se "Button1" fosse um ponteiro, e usando a sintaxe do > Delphi para deferenciamento de ponteiros, este "ponteiro" deveria permitir > acessar um de seus atributos. Tanto nao eh um ponteiro que o compilador nao > permitie este tipo de comando, justamente porque "Button1" nao eh um > ponteiro, eh uma referencia. > > A linuagem Java jah eh outro exemplo de que a variavel "x", do exemplo > anterior, nao eh um ponteiro porque sequer esta variavel tem dentro de si > enderecos de memoria, mas apenas identificadores que sao criados, e tratados > internamente pela JVM. > > Por isso eh que eu escrevi que "x" nao deve ser classificado como ponteiro, > mas sim como uma "referencia a objeto". > > Desculpem, mas este e-mail foi maior ainda que o anterior.
Clayton, Entendi bem e gostei dos teus comentários a respeito de alocação de memória para instâncias de objetos. Vejo que eu tenho termos diferentes para situações semelhantes, e isso pode estar ocasionando algum desentedimento. Vejamos: Nos tempos do DOS, uma variável x: Integer ocupava uma área fixa de memória, e outra variável x: ^Integer também (e também apontava para uma área fixa). SOs de verdade (*nix, Win e até os Windows mais antigões - que na verdade sequer pode ser chamado de um SO de verdade) movem os dados de um lugar para o outro conforme sua necessidade ou a necessidade do aplicativo que este está gerenciando. Se você tem uma simples variável x: Integer, estática, você não pode garantir que ela começará e terminará na mesma posição. Quando você acessa o conteúdo desta variável, o SO captura a informação e devolve pra você (apenas ele sabe a localização, pode inclusive estar na memória virtual). Quando falo em ponteiros, estou falando de uma convenção. Se eu fosse pegar os conceitos de um SO para dizer se um x: Integer é um ponteiro, eu seria obrigado a dizer que é, pois o conteúdo pode mudar de lugar. Você (ou o autor do seu livro) diz que uma classe não é ponteiro porque aponta para uma referência do endereço, e não para o endereço. Agora eu estou falando em termos práticos, estou falando do meu aplicativo (e não a forma que o compilador gera o código binário do meu programa). Quando eu boto Button:=TButton(Components[n]); estou fazendo um apontamento para um endereço de memória, no mais, o compilador que se vire pra fazer o que eu quero. Quanto a sua chamada (Button^), isto só não é possível porque Button foi criado como uma classe e deve respeitar a forma de trabalhar de uma classe, mas não deixa de ser um apontador, um ponteiro. Classes dispensam o uso do circunflexo porque o compilador sempre sabe quando você está fazendo referência ao endereço (uma atribuição) ou à informação (chamada de um método ou propriedade). Bah, falei demais também. -- João Morais -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html