Determinação do método
correspondente a uma mensagem:
as variáveis especiais "self" e "super"
Como foi visto na seção anterior, uma classe herda os métodos definidos nas classes acima na hierarquia, mas pode também redefiní-los e acrescentar outros. Quando um objeto recebe uma mensagem, é iniciada uma busca no protocolo específico de sua classe. Caso a mensagem seja encontrada, o método correspondente é executado. Caso contrário, a busca continua no protocolo da sua super-classe, e assim sucessivamente até chegar ao topo, na classe Object.
Para ilustrar, seja a hierarquia de classes abaixo, onde são mostrados
os protocolos de cada uma, e os nomes dos métodos correspondentes
a cada mensagem:
Note que a classe AA redefine o método para a mensagem mens1, e a classe AAA redefine o método para a mensagem mens2.
Sejam 3 objetos, referenciados pelas variáveis x, y, e z, tais que:
x := A new . "x é da classe A"
y := AA new. "y da classe AA"
z := AAA new. "z da classe AAA"
Suponha a seguir a sequência de expressões abaixo. Os métodos que serão ativados são mostrados ao lado de cada mensagem, entre parênteses:
Note que a mensagem mens5 não pode ser compreendida por y, pois não foi implementada em sua classe, nem em nenhuma de suas super-classes. O mesmo ocorre com a mensagem mens4 enviada a x.
Quando um objeto recebe uma mensagem, o método correspondente é ativado. Esse método, por sua vez, é composto por uma outra sequência de mensagens. As variáveis self e super podem ser usadas em qualquer expressão de um método M para representar o próprio receptor da mensagem que ativou M. A diferença entre mensagens dirigidas a self ou a super está na forma como Smalltalk inicia a busca do método correspondente. Quando uma mensagem, dentro de um método M, é enviada a self, a pesquisa do método correspondente inicia-se na classe do receptor da mensagem que ativou M. Caso a mensagem seja enviada a super, então a pesquisa inicia-se na super-classe do receptor.
Voltando ao exemplo anterior, suponha que o objeto z recebeu a mensagem mens5, ativando o método método5. Suponha agora que, dentro de método5 ocorram as seguintes expressões:
Em ambas, self e super referem-se ao mesmo objeto referenciado por z, que é o receptor da mensagem que ativou método5. A primeira mensagem ativará o método método2a, enquanto a segunda ativará o método método2 pois, nesse último caso a pesquisa se iniciará na classe AA.
A sintaxe das expressões em Smalltalk será vista com maior detalhe em Expressões e Métodos em Smalltalk.