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

Dúvida com o abstract

Pessoal tenho duas classes diretor e gerente que são filhas de Funcionario. Porém a classe Diretor exige que eu coloco o tipo como abstract mas a gerente não. E se coloco na gerente, ela não compila. Por que um precisa do abstract e outra não se ambas são filhas de funcionario?

abstract class Funcionario {
  protected String nome;
  protected String cpf;
  protected double salario;


  public void setNome(String nome) {
    this.nome = nome;
  }

  public String getNome() {
    return this.nome;
  }

  public void setCpf(String cpf) {
    this.cpf = cpf;
  }

  public String getCpf() {
    return this.cpf;
  }

  public void setSalario(double salario) {
    this.salario = salario;
  }

  public double getSalario() {
    return this.salario;
  }

  abstract double getBonificacao();


  public void mostra() {
      System.out.println("Nome: " + this.nome);
      System.out.println("Bonus: " + this.getBonificacao());
  }



}
public abstract class Diretor extends Funcionario implements Autenticavel {
    private int senha;

    public void cobraRelatorios() {
        System.out.println("Preciso dos relatórios!");
    }

    @Override
    double getBonificacao() {
        return this.salario * 0.35;
    }

    @Override
    public boolean autentica(int senha) {
        if(this.senha == senha) {
            return true;
        }
        else {
            return false;
        }
    }

}
public class Gerente extends Funcionario implements Autenticavel {
    private int senha;

    public boolean autentica(int senha) {
      if(this.senha == senha) {
          System.out.println("Acesso permitido!");
          return true;
        }
        else
        {
          System.out.println("Acesso negado!");
          return false;
        }
      }

      public double getBonificacao() {
        return this.salario * 1.4 + 1000;
      }
}
7 respostas

Olá Geovane, tudo bem?

Fiz um teste com o seu código enviado e compilou normalmente. Qual é o erro apresentado? Envie a interface Autenticavel também, por favor.

Fico no aguardo, abraço!

O método autentica da classe Diretor está anotado com @Override, isso significa que esse método foi declarado na super classe ou interface. Pelo nome, supõe-se que ele seja da interface Autenticavel. Declarando esse método na interface, o código funcionará, e a classe Diretor poderá ser concreta ao invés de abstrata.

public interface Autenticavel {
    boolean autentica(int senha);
}

Otávio, essa é a minha interface:

public interface Autenticavel {

    public boolean autentica(int senha);

}

Daniel, o meu método já existe na minha interface.

Esse capítulo me deixou muito confuso! Também não entendi o porquê que a minha classe SistemaInterno tem um método autentica se ela não implementa autenticável. Vou voltar no capítulo do abstract e rever este também.

Olá Pessoal,

consegui resolver o problema da minha classe Diretor. Porém eu não lembro exatamente o que fiz, mas ela já não é mais abstract.

Para encerrar o tópico, quero apenas entender essas quatro coisas (estou afirmando, mas não tenho certeza):

1 - Classes são especificações para objetos (?);

2 - Classes abstratas são especificações para outras classes (?);

3 - Defino um método como abstract quando este tem comportamentos diferentes nas classes filhas (?);

4 - A diferença entre classes abstratas e interfaces é que interfaces permite que qualquer classe implemente o seus métodos, enquanto que em classes abstratas eu devo restrigir a um grupo com características e comportamentos em comum. (?)

solução!

Vou tentar responder algumas coisas:

1- Classes são conjunto de objetos com os mesmos atributos e comportamentos (métodos)

2 - Classes abtratas são classes "modelos", você por exemplo tem uma classe animal com seus atributos e comportamentos e sub-classes como cachorro e gato. esses bichos irão herdar da classe animal, no entanto a classe animal é so um modelo para as suas sub-classes. Com isso seus atributos são herdados e OBRIGATORIAMENTE seus métodos tbm devem ser herdados.

3- método abstrato é o método de uma classe abstrata que não possui implementação

4 - Dedução correta !

Valeu Pedro!

Boa noite, até chegar em abstract e intefaces estava indo bem agora com isso, esta bem complicado e o video não ajuda muito esta bem complicado as aulas.