Olá, sou iniciante em POO e estou com uma dificuldade. Já peço perdão pelo texto longo que precisei escrever para explicar o problema. Tentei remover as redundâncias, mas me pareceu melhor com elas. Espero que dê para entender
Antes de ler o problema, veja como é a estrutura do meu projeto:
Tem uma classe principal chamada “ProjetoCanideo”, na qual fica o método “main”. Tem uma classe “raiz” chamada “Canideo” que tem 3 atributos privados com seus respectivos métodos “Getter” e “Setter” e um construtor que recebe aqueles 3 atributos. Tem também uma subclasse chamada “Cachorro”, que estende “Canideo”, que tem 5 atributos privados, também com seus respectivos métodos “Getter” e “Setter” e também um construtor que recebe aqueles 5 atributos. As classes “Canideo” e “Cachorro” também possuem o método “toString”, sendo que a subclasse concatena os atributos da superclasse usando a palavra “super”.
Problema:
Eu criei um objeto “Scanner” para receber dados do usuário e instanciei a classe “Cachorro” que receberá esses dados, mas tive que desativar os construtores das classes “Cachorro” e “Canideo” para fazer funcionar, isso porque preciso receber um dado por vez já que preciso mostrar mensagens, uma por vez, solicitando os dados. Foi necessário desativar os construtores porque ao instanciar uma classe que tem um construtor que recebe parâmetros, fico obrigado a informar todos eles no momento que crio o objeto. Eu poderia usar variáveis auxiliares na classe principal, mas acho que se eu fizer isso, vai perder um pouco a graça do encapsulamento. Obs.: Estou desconsiderando a “sobrecarga” do método construtor, que poderia criar ali junto um outro método construtor que não recebe parâmetros, porque acho que não se aplicaria para este caso.
Como uma solução mais elegante do que usar variáveis auxiliares na classe principal, eu estou usando os métodos “Setter” da classe “Cachorro”, e os herdados, para atribuir os dados recebidos para suas variáveis privadas, mas o meu desejo é de coletar os dados informados pelo usuário diretamente para os parâmetros do construtor da classe “Cachorro”, construtor esse que precisaria estar ativo, de maneira que eu não precise usar esses métodos “Setter” um por um.
Se fosse só para atribuir, não seria problema, eu poderia reativar os construtores e bastaria colocar o objeto de “Scanner” com o método “nextLine()” para cada uma das posições dos parâmetros do construtor, mas eu quero, como eu falei antes, mostrar mensagens solicitando dados do usuário usando o “print”, mas não tem como colocar o “print” junto com o “nextLine()” na posição do parâmetro, ou seja, dentro do chamamento do construtor.
Isso me obriga a fazer as coletas separadamente, como por exemplo, um “print” pedindo o nome e em seguida o “nextLine()” com o método “Setter” dentro para coletar o nome, além de que fico obrigado, como já falei, a desativar os construtores para conseguir instanciar a classe “Cachorro” sem passar parâmetros no construtor para poder usar esses métodos “Setter” ou qualquer outro método dela.
Será se tem como fazer o que eu quero?
Como este é um projeto apenas para aprendizado, estou disponibilizando o código fonte feito em IntelliJ para vocês analisarem. Como sou novo usuário, não pude subir o arquivo diretamente aqui, então coloquei na minha conta do OneDrive: https://1drv.ms/u/s!AlX3C7qG4wUDd8RGmTqsoqXujNc?e=QHhId6
Se você chegou até aqui, PARABÉNS e OBRIGADO!!! Você é uma pessoa com muita paciência hehe