Override de ToString() e operadores novos

2009-01-15

Ontem estive numa curta discussão acerca das potencialidades de herança nas classes, em programação por objectos, em especial no .NET, com um amigo que está a estagiar comigo. Bastou um pequeno exemplo para demonstrar alguns dos princípios.

Comecei por recordar o principio da herança com um diagrama muito simples:

Neste exemplo ClasseBase, como o nome sugere, é base de ClasseDerivado1 e ClasseDerivado2, e tendo propriedades publicas e métodos publicos, essas propriedades estarão, tambem, presentes em nas classes derivadas. Ou seja

ClasseDerivado1 tem (publicamente) acessível as propriedades prop1, prop2 e prop3, e ainda os metódos meth1 e meth2.
ClasseDerivado2 tem (publicamente) acessível as propriedades prop1, prop2 e prop4, e ainda os metódos meth1 e meth3.

A conversa depois seguiu para o facto de poder fazer overide de métodos da base na classe derivada. Em concreto falamos do ToString(). Todos os objectos criados em .NET derivado da base Object, que, entre outras, tem o método ToString(). Por defeito este devolve o valor da instancia (quando é um tipo de valor, por exemplo, int, byte, bool, char..). Quando se trata de um tipo que é referência (exceptuando a string), é devolvido o nome completo da classe (namespaceCompleto.nomeDaClasse). No entanto, nada me impede de redefinir o ToString(). Por exemplo, numa classe “Pessoa”, posso querer que o ToString() devolva a concatenação do primeiro e último nome.

Como conseguir?

Usando a declaração “public overide string ToString()”, posso redefinir o funcionamento do método. Se necessitar de recorrer, por alguma razão, ao ToString() da base, posso através da instrução

No exemplo em cima, o método devolve o nome da class (“QQcoisa”) concatenado com um espaço e por fim o valor em myVar (que por defeito é “olá”).

É um exemplo simples do poder e flexibilidade de OOP.

A conversa continuou com a menção da criação de operadores para as classes. As potencialidades criadas pro esta funcionalidade é enorme. Por exemplo posso no meu código definir o que é uma soma de dois objectos (que não são valores). Por exemplo posso definir que somar dois QQcoisa é somar os valores presentes em myVar de cada um das instâncias.

Nem todos os operadores permitem redefinição. A lista dos operadores que podem ser redefinidos estão no MSDN. Para redefinir, usa-se a declaração:

Simples, até.