Usaremos sobrecarga de métodos para implementar incluiAluno de
DisciplinaPos e usaremos o fato de AlunoIC herdar de AlunoGrad, para
implementar o incluiAluno de DisciplinaGrad.
class DisciplinaPos extends Disciplina { private Aluno alunos[]; DisciplinaPos(String nome) { super(nome); } //este método só incluirá alunos da pós-graduação void incluiAluno(AlunoPos umAluno) { if (qtdAlunos < 30) { alunos[qtdAlunos] = umAluno; qtdAlunos = qtdAlunos + 1; return; } } //este método só incluirá alunos de IC void incluiAluno(AlunoIC umAluno) { if (qtdAlunos < 30) { alunos[qtdAlunos] = umAluno; qtdAlunos = qtdAlunos + 1; return; } } .. } class DisciplinaGrad extends Disciplina { private AlunoGrad alunos[]; DisciplinaGrad(String nome) { super(nome); } //como AlunoIC é uma subclasse de AlunoGrad, //o parâmetro umAluno também pode ter o tipo AlunoIC. void incluiAluno(AlunoGrad umAluno) { if (qtdAlunos < 30) { alunos[qtdAlunos] = umAluno; qtdAlunos = qtdAlunos + 1; return; } } .. }
Também poderíamos utilizar um if-else para diferenciar os tipos de alunos, entretanto, a solução usando sobrecarga é bem mais elegante.