Herança com agregação

11 respostas
NickXD

tenho uma classe chamada jogador. Há uma classe chamada servo que está agregada à ela. O servo é superclasse de Comum e Lendario. Jogador so pode ter ou o servo lendario ou o servo comum e tenho q passa-lo no construtor. Porem pode ser um ou outro, entao n da pra definir q sera aquele e ponto final. Oq faço?

11 Respostas

juliofsn

Então Jogador vai possuir um Servo, se comum e lendário herdam dele, então seu problema está resolvido, tanto comum ou lendário podem ser passados para o Jogador.

I

@juliofsn, creio que dúvida dele seja: depois que eu passar o servo, Comum ou Legendario, na manipulação, como saber qual é qual, ou seja, se foi passado um objeto Comum ou Legendario. Confirma @NickXD?

NickXD

Então. Na vdd eu já resolvi meu problema. A minha dúvida tava em q seu eu colocasse lendário no construtor, comum n era aceito e vice versa. E se eu colocasse servo n conseguiria nem usar lendário ou comum. Mas juliofsn disse q se colocasse servo dava pra passar os dois na declaração de um jogador. Só q nisso eu já tinha resolvido meu problema. N fiz nd disso. Sobrecarreguei o construtor podendo aceitar tanto lendário como comum. E foi isso. Mas obg a tds.

juliofsn

@NickXD, entendi o que você fez, mas assim, você resolveu o problema de programação, mas continua com um problema de modelagem. Se o Jogador possui um Servo, não deveria importar qual a classe concreta (se lendário ou comum).

Imagine se você adiciona um novo tipo de Servo, por exemplo MasterPlus. Agora você vai ter que criar um novo construtor para Jogador, mudar código de dentro de Jogador pra tratar essa nova classe, sendo que, se bem modelado, você não deveria ter que mexer em Jogador por uma adição de outro tipo de Servo.

NickXD

Realmente faz sentido. Obrigado, vou resolver aqui

NickXD

Então eu tentei isso agr, mas diz q servo n consegue usar os métodos de comum nem de lendário. Isso pq tanto comum quanto lendário são subclasses então podem usar os métodos de servo, porém servo n consegue usar métodos da subclasses

I

Concorda que se uma classe (superclasse) puder fazer tudo que uma outra classe (subclasse) fizer, não faz sentido ter duas classes? A herança prevê as ideias de generalização e especialização. As classes filhas (subclasses) especializam (ou deveriam) a classe mãe, ou seja, fornecem mais informações sobre determinada coisa. Por outro lado, a classe mãe (superclasse) generaliza essas informações, ou seja, fornecem as informações básicas. É por isso que a herança define uma hierarquia de classes. Além disso, por exemplo, se uma classe Animal pudesse se comportar como um Mamifero (uma subclasse sua), também poderia se comportar como Ave, Reptil, Peixe e Anfibio que também são subclasses suas. Então teríamos um objeto a que seria ao mesmo tempo tudo isso! Teríamos um monstrengo, tanto na vida real, quanto na programação.

juliofsn

@NickXD Eu respondi apenas como uma dica. Realmente a modelagem é difícil e pode demandar uma alteração grande no seu código. Nesse caso o que você poderia fazer é definir o comportamento em comum de ambos os servos e Jogador deveria ter acesso apenas ao comportamento que é comum a ambos, mesmo que executem de formas diferentes.

Mas aí já estamos entrando num tópico relativamente avançado. Só se atente a isso nos seus estudos, pois numa aplicação pra valer, isso evita muitos problemas.

juliofsn

@Iohannes Acho que você está fazendo uma pequena confusão aqui. Quando você possui uma interface ou superclasse, Animal no seu exemplo, e diz que Ave, Réptil, Peixe e Anfíbio são animais, não quer dizer que Animal tem tudo que essas classes têm, mas que todas essas classes tem coisas em comum, que podem ser agrupados na classe Animal. Por exemplo, todos eles são capazes de se movimentar, cada um do seu jeito diferente, a ave voa, o peixe nada, o anfíbio anda ou nada, o réptil tbm, mas pra outras classes que usam a classe Animal isso não importa, então ele só espera que o Animal se movimente, não importa que tipo de Animal seja.

I

Você não entendeu o que quis dizer ou eu é quem se expressou mal. Eu quis dizer que não faz sentido que a classe Animal tenha comportamento das classes filhas (especializações) como Reptil ou Mamifero, por exemplo, porque há comportamentos próprios de um mamífero que não são de um réptil, pois ela (a classe Animal) deve ser genérica e as filhas (Reptil e Mamifero) as especializadas.

juliofsn

Ah sim, então entendi mal mesmo, desculpas, mas como falei na outra resposta, acho que já estamos saindo do escopo da pergunta dele.

Criado 11 de dezembro de 2019
Ultima resposta 12 de dez. de 2019
Respostas 11
Participantes 3