Objeto é a noção de uma entidade que é definida inteiramente pelo seu comportamento. E esse comportamento é dinâmicamente selecionado. Em outras palavras, eu "peço" um objeto para "andar," e como ele vai fazer isso é inteiramente definido pelo objeto.
O exemplo:
objeto.anda()
Captura bem essa idéia. Eu tenho uma mensagem "anda," mas eu não consigo dizer o que essa função faz direto do meu código, porque isso depende no comportamento dinâmico da execução do programa (em uma linguagem estáticamente tipada você consegue optimizar isso, mas o raciocínio do código continua o mesmo).
Como os objetos são definidos inteiramente por aquilo que eles fazem, não faz muito sentido (do ponto de vista de OO) "marcar" o objeto com um nome único (tipagem nominal). Dessa forma, tipagem estrutural deveria ser o default para explorar essa idéia de "programação em cima de interfaces," com a possibilidade de optar por essa "marcação especial."
Por que Java não suporta bem OO? Porque quando você escreve:
if (a > b) { ... }
Você para de trabalhar com essa idéia de que o seu programa é o resultado da interação de objetos, e começa a trabalhar com a idéia de programação procedural ou funcional (dependendo de outras propriedades).
O correto, nesse caso, seria que o objeto True e o objeto False fossem as únicas coisas que determinassem seu if/else
. Que >
fosse só um método de qualquer objeto (não só números). E assim por diante. De outra forma, você está programando com uma forma muito limitada da idéia, e não pode aproveitar os benefícios desse modelo computacional (principalmente a parte de programar para interfaces).
Em outras palavras:
(a.>(b)).thenElse({ ... }, { ... })