Uniformidade do ambiente Smalltalk - mensagens de classe
A linguagem Smalltalk foi desenvolvida com a preocupação de criar um ambiente de desenvolvimento e operação de software totalmente uniforme. Essa uniformidade foi sendo implementada ao longo das diversas versões (Smalltalk-72, Smalltalk-76, Smalltalk-80) e foi completada com a versão Smalltalk-80.
Todo processamento em Smalltalk obedece ao mesmo paradigma de objetos e mensagens, seja para programar uma aplicação, utilizar funções do sistema, ou usar uma aplicação qualquer.
Seja, por exemplo, a criação de instâncias de uma determinada classe. Nos exemplos da sessão anterior, instâncias das classes Ponto e Retangulo foram criadas através do envio de mensagens a objetos. Mas a forma mais geral de criar instâncias de uma classe é enviar uma mensagem específica à própria classe. Isso só é possível porque classes são também objetos e, portanto, obedecem ao mesmo formalismo de reação a mensagens.
A mensagem padrão para se criar uma nova instância de uma classe C qualquer é new, como nas expressãoes abaixo:
C new
x := C new
A classe C reage à mensagem e cria uma nova instância de si mesma, retornando uma referência a ela. Na segunda expressão, a variável x passa a referenciar essa nova instância. Os componentes de instâncias criadas com essa mensagem são inicializados com uma referência ao objeto nulo nil. Esse objeto é a única instância da classe UndefinedObject.
Como objeto, toda classe é também instância de alguma outra classe. Essa classe é normalmente uma sub-classe da classe Behavior, ou seja, Behavior contém o protocolo e a descrição da estrutura de dados comuns a todas as classes do sistema. Por exemplo, a mensagem new faz parte do protocolo da classe Behavior.
Em muitos casos é conveniente para uma classe ter uma estrutura de dados, mensagens e métodos específicos para ela. Os métodos específicos referem-se normalmente à inicialização de suas instâncias de forma particular, e suas estruturas podem conter informações que sejam comuns a todas as suas instâncias.
Por exemplo, a classe Date é a classe que define o protocolo para instanciar, comparar e computar datas diversas. Essa classe reage à mensagem today respondendo com uma instância (uma data) com o valor da data de hoje, como em:
d := Date today
Instâncias de Date reagem, por sua vez, à mensagem dayName, respondendo com o nome do dia da semana a que correspondem. Portanto a sequência:
Date today dayName
produz como resultado o nome do dia da semana da data de hoje.
Note que, enquanto today é uma mensagem específica para a classe Date, dayName é uma mensagem específica para instâncias de Date.