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

 



Responder a