Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Polimorfismo em um sistema escolar

Oi gente, estava tentando praticar polimorfismo e me veio um exemplo na cabeça. Tentei fazer um sistema escolar, onde o professor pode alterar a nota da matéria dele e o aluno pode visualizar a nota de cada matéria. Criei a classe usuariodaescola e os filhos professor e aluno. Porém, não sei como atribuir uma nota para cada matéria específica. Não se se nota vira uma nova classe que nem no esquema que eu fiz a seguir, ou se crio uma lista de matérias e notas e relaciono as duas. Se puderem me ajudar, agradeço, pois é fundamental para eu saber se estou ou não entendendo polimorfismo.! Esquema feito por mim para resolução desse problema

4 respostas

Oi Leonardo, beleza? Nesse projeto que você pensou, há uma forma interessante de desenvolvê-lo, de modo que usaremos com maior ênfase a Herança e a Composição. Seguindo a sua ideia, nós podemos iniciar ele criando uma Classe usuárioEscola, que vai funcionar como uma SuperClass, uma classe-mãe, que a partir dela criaremos duas classes filho: Professor e aluno. Vamos colocar o mínimo de atributos que sejam comuns a todos os usuários e os Getters e Setters correspondentes.

public class UsuárioEscola {

private String nomeDoUsuario;
private String cpf;
private int idade;

public String getNomeDoUsuario() {
    return nomeDoUsuario;
}
public void setNomeDoUsuario(String nomeDoUsuario) {
    this.nomeDoUsuario = nomeDoUsuario;
}
public String getCpf() {
    return cpf;
}
public void setCpf(String cpf) {
    this.cpf = cpf;
}
public int getIdade() {
    return idade;
}
public void setIdade(int idade) {
    this.idade = idade;
}
}

Agora, podemos criar as classes filhas de modo que, (aqui vai o segredo da questão em!), a Classe Professor guarde uma referência a objetos alunos como um de seus atributos.

public class Professor extends UsuárioEscola{

    private Aluno aluno;

    public Aluno getAluno() {
        return aluno;
    }
    public void setAluno(Aluno aluno) {
         this.aluno = aluno;
    }
}

Agora, ao criar uma Classe Aluno cujos atributos sejam as notas das matérias que cada aluno tem, poderemos na execução do código criar um objeto Professor, ou mais, bem como vários objetos Alunos, e o Professor vai conseguir se ligar aos objetos Alunos, alterando as notas deles!!

public class Aluno extends UsuárioEscola {

private double notaMatematica;
private double notaPortugues;
private double notaHistória;
private double notaGeografia;
private double notaLiteratura;

public double getNotaMatematica() {
    return notaMatematica;
}

public void setNotaMatematica(double notaMatematica) {
    this.notaMatematica = notaMatematica;
}

public double getNotaPortugues() {
    return notaPortugues;
}

public void setNotaPortugues(double notaPortugues) {
    this.notaPortugues = notaPortugues;
}

public double getNotaHistória() {
    return notaHistória;
}

public void setNotaHistória(double notaHistória) {
    this.notaHistória = notaHistória;
}

public double getNotaGeografia() {
    return notaGeografia;
}

public void setNotaGeografia(double notaGeografia) {
    this.notaGeografia = notaGeografia;
}

public double getNotaLiteratura() {
    return notaLiteratura;
}

public void setNotaLiteratura(double notaLiteratura) {
    this.notaLiteratura = notaLiteratura;
}

}

Uma vez criada a classe aluno, veja como seria possível um professor alterar as notas de diversos alunos:

public class AmbienteDeTestes {

public static void main(String[] args) {

    Professor paulo = new Professor();
    paulo.setNomeDoUsuario("Paulo Rodrigues de Assis");
    paulo.setCpf("19890299-23");
    paulo.setIdade(33);

    Aluno lucas = new Aluno();
    Aluno davi = new Aluno();

    paulo.setAluno(lucas);
    paulo.getAluno().setNotaMatematica(8.8);
    paulo.getAluno().setNotaPortugues(7.9);
    paulo.getAluno().setNotaGeografia(6.9);

    paulo.setAluno(davi);
    paulo.getAluno().setNotaMatematica(7.5);
    paulo.getAluno().setNotaPortugues(9.8);
    paulo.getAluno().setNotaGeografia(7.5);

    System.out.println("Notas do Lucas: ");
    System.out.println(lucas.getNotaMatematica());
    System.out.println(lucas.getNotaPortugues());
    System.out.println(lucas.getNotaGeografia());

    System.out.println();
    System.out.println();

    System.out.println("Notas do Davi");
    System.out.println(davi.getNotaMatematica());
    System.out.println(davi.getNotaPortugues());
    System.out.println(davi.getNotaGeografia());



}

}

Espero ter ajudado de alguma forma e bons estudos!

Incrível!!!!!!!!!!!!!!!!!!! Ajudou MUITO! Só uma dúvida, além de pessoas e coisas com hierarquia, existem outras maneiras de usar polimorfismo em lógica? Não sei se deu pra entender muito bem, até porque usar pessoas e coisas com hierarquia já é uma lógica, mas por exemplo, fazer que nem esse sistema de notas e matérias. MUITO OBRIGADO MESMO!

solução!

Nós vamos usar o polimorfismo principalmente quando desejarmos trazer alguma informação comum a todas as classes filhas para um lugar só. É possível entender o polimorfismo também como uma porta, pela qual todos os objetos das classes vão passar e deixar a resposta correspondente a um valor delas. No caso da escola, por exemplo, podemos supor que os alunos, professores e quaisquer usuários da escola podem ir nas excursões, desde que paguem a taxa correspondente a cada um. Assim, foi criado um departamento pra receber os pagamentos, guardando o montante acumulado. Na sala desse departamento vão entrar os Professores, Alunos, Diretores (note bem que são objetos das classes) e efetuar o pagamento. E aqui poderemos utilizar o polimorfismo, pois veja bem, temos objetos de diferentes classes que tem um método em comum, o "getTaxaDeExcursao", apenas a implementação é diferente, e queremos que cada um informe o valor correspondente a sua taxa no departamento e faça o pagamento.

A regra de taxa, no nosso caso, pode ser assim:

Professores pagam 100 reais; alunos pagam 200; Diretores pagam 50;

Em se tratando de código, temos: Inicialmente, podemos tornar a classe usuarioEscola abstrata, o que significa que ela não pode ser instanciada, ou seja, não poderemos mais criar objetos usuarioEscola. Essa ideia faz sentido, porque não há ninguém na escola que é apenas usuário, a pessoa pode ser aluno, professor, diretor, mas não pode ser apenas usuário!

    public abstract class UsuárioEscola {

private String nomeDoUsuario;
private String cpf;
private int idade;

Agora, podemos criar um método que também seja abstrato, a vantagem de fazer isso é que você obriga as classes filhas a implementarem o método!! Elas não vão compilar enquanto não implementarem o método! (colocar um corpo, instruções nele)

public abstract class UsuárioEscola {

private String nomeDoUsuario;
private String cpf;
private int idade;


public abstract double getTaxaDeExcursao();

Os métodos abstratos são declarados na classe mãe vazios e os filhos implementarão: Aluno

public class Aluno extends UsuárioEscola {
@Override
public double getTaxaDeExcursao() {
    return 100;
}

Professor:

public class Professor extends UsuárioEscola{

@Override
public double getTaxaDeExcursao() {
    return 100;
}

Agora, executando, poderíamos definir alguns objetos alunos e professores, e em seguida, em uma outra classe que representaria o departamento, fazer o polimorfismo estabelecendo que a referência é do tipo usuarioEscola, (um tipo mais abrangente), que só é possível ser feito porque tanto Professor quanto Aluno são, por herança, usuarioEscola! Veja bem, inicialmente, os objetos da classe Professor teriam uma referência do tipo professor :

public class AmbienteDeTestes {

Professor paulo = new Professor();

"paulo" armazena a referência para o objeto, certo? E o tipo de referência aqui é Professor! Mas também é possível que seja UsuárioEscola, pois um professor é um UsuárioEscola. E assim o polimorfismo vai trabalhar como porta para permitir que coloquemos a referência de diferentes objetos em um tipo mais abrangente, a classe mãe, e objetos de classes diferentes poderão usar um mesmo método, como o abaixo:

public class DepartamentoExcursao {

public double receberTaxa (UsuárioEscola g) {
    return g.getTaxaDeExcursao();
}
}

Observe, ao invocar esse método na área de testes, precisaremos passar um parâmetro, que será a referência ao objeto, por exemplo, "paulo", que é a referência ao objeto professor. Essa referência assume o lugar de "g", e vai funcionar pois o tipo de referência será UsuárioEscola, a mais abrangente, e assim, qualquer objeto aluno ou professor poderá usar o método. Isso é polimorfismo, uma porta que permite diferentes tipos de objetos acessarem um mesmo objeto e nele imprimirem seus próprios métodos.

public class AmbienteDeTestes {

public static void main(String[] args) {

    Professor paulo = new Professor();

    Aluno lucas = new Aluno();
    Aluno davi = new Aluno();

    DepartamentoExcursao departamentoDeExcursao = new DepartamentoExcursao();

    System.out.println(departamentoDeExcursao.receberTaxa(davi));
    System.out.println(departamentoDeExcursao.receberTaxa(lucas));
    System.out.println(departamentoDeExcursao.receberTaxa(paulo));

}

}

Esse assunto não é simples, se tiver dúvidas, recomendo fortemente assistir as aulas de polimorfismo e classes abstratas e anotar muito. Bons Estudos! Gentileza marcar o tópico como concluído, não sei se é possível, mas se tiver algum jeito :p

MUUUUUITÍSSIMO OBRIGADO, AMIGO!!!! Estou entendendo sim! Incrível explicação!

Valeuuuu!