Ajuda com OO

Tirem uma dúvida básica?
Há muito que aprendi OO e trabalho apenas procedural, agora quero retomar .
Como eu deveria arquitetar algo com:
Pessoa
Animal
Cachorro
Gato
Mulher

Onde existam 3 comportamentos em comum para todos: acordar, passear e dormir?

Possivelmente o jeito mais direto é agrupar os comportamentos comuns em uma classe base que as contém e criar classes derivadas para os os casos específicos.

Quais comportamentos são comuns e quais são específicos (ou seja, requerem uma subclasse), é você quem precisa determinar, de acordo com o caso.

O seu caso abre margem para várias implementações. Por exemplo, pode se argumentar que Pessoa, Cachorro, Gato e Mulher são animais, então Animal poderia ser a classe base da qual Pessoa, Cachorro, Gato e Mulher estendem.

Mulher, dependendo dos requisitos, também pode ser visto como uma classe que estende Pessoa.

Abraço.

Depois de postar, cheguei a fazer algo. Vejam por favor o que acham em relação a tentar fazer algo “mais correto” no sentido de OO. Só achei que eu sobrescrevi muito método.

Interface IComportamento:
com comportamentos acordar, passear e dormir

Classe Animal implementando IComportamento
Classe Pessoa implementando IComportamento

classes cachorro e gato herdando de Animal

classe Main:
Cachorro cachorro = new Cachorro(‘Bob’);
Gato gato = new Gato(‘Gatuxo’);
Pessoa pessoa = new Pessoa(‘João’);

    pessoa.acordar();
    gato.dormir();
    cachorro.passear();

tive que implementar os comportamentos apenas nas classes Pessoa e Animal.

Veja, qual deles é o elemento mais genérico? Certamente, Animal, não é? Começa por aí e vai analisando qual seria a hierarquia adequada.

Ola Darlan, gostaria que alguém analisasse como um todo. Essa parte somente de Herança eu conheço, inclusive não segui o conselho de implementar os comportamentos em subclasse porque fugiria do conceito É UM TIPO DE, que deve ser analisado quando se estende algo

Não tem como analisar o que você fez sem que você poste aqui o que fez, né?

1 curtida

Antes de determinar qual a melhor abordagem, você precisa definir qual o objetivo.

O “mais correto” é relativo, e depende do escopo e do problema a ser resolvido. Sem estabelecer um limite, você pode acabar com 20 classes pra modelar um problema que envolveria 4 (ou menos).

Se o que você quer saber se a sua abordagem de criar uma Interface IComportamento é válida, a resposta é sim: você pode modelar o projeto dessa forma se conseguir obter o resultado esperado do programa (que é o que importa no fim das contas).

Se o que você quer saber é se essa abordagem é a melhor sempre, releia o segundo parágrafo dessa resposta. A melhor abordagem depende do problema a ser resolvido.

Se o que você quer saber são quais as vantagens e desvantagens de cada possível abordagem (dentro de um limite de abordagens, é claro), faça o seguinte exercício: monte a hierarquia com 2 ou 3 abordagens diferentes (como a sua e as que foram sugeridas) e compare o que foi mais fácil e mais difícil em cada uma delas. Se uma dá mais trabalho que a outra, analise se o trabalho extra vale a pena, e como ele melhora o programa como um todo.

Abraço.

Tente praticar com cenários reais. Exemplo sem utilidade só vai enrolar mais seu entendimento.

Obrigado a todos!