Nao acho que seja questao de lei… Mas vai chegar uma hora no sistema, mesmo que na insercao no banco de dados, que ele vai precisar tratar um Usuario ou Contato como Pessoa. E ai? Como fazer o teste sem herança/interface?
galera vlew pelas dicas, mais OO não é o problema o que eu estou achando estranho é uma possivel inverssão de papel nesse caso, eu sou completamente adepto a herança em alguns casos, mais esse é especial…
pois um Usuario pode algum dia se tornar um Contato ou vice-versa
um Contato pode tornar-se um Usuario
Mas pq vc estaria preocupado com essa inversão de valores…
digamos que Robert é um usuário e esta cadastrado assim.
e que Mariana é um contato…
Agora vamos iverter os valores…Robert é um contato LOGO vc terá dois Roberts um usuário e um contato.
Se isso esta gravado num SGBD…você poderia tanto apagar o Robert usuário e passa-lo para contato OU criar uma relação MANY-TO-MANY entre contato e usuário.
Infelizmente o mundo relacional é bem diferente do mundo OO então talvez haja algumas dificuldades de leitura na hora de transferir de um lado para o outro (mas faz parte :D).
Quanto a não gostar de herança, acho que ela não é interessante quando você tem que herdar classes externas a seu sistema, como de frameworks (como é o struts) ou coisa assim já que o deixa totalmente dependente e acoplado ao FW, só que no seu caso (na minha humilde opinião) acho interessante porque diz respeito ao comportamento dos objetos do seu sistema, se tanto seu usuario, quanto seu contato se comportam como Pessoas então a herança é interessante.