subclass does not incorporate super class method

Asked

Viewed 170 times

0

This is the first time I’ve had this mistake. I have the Class Loja that extends into several subclasses. problem is that subclasses do not "ask" the super method

Shop:

public abstract class Loja {

/**
 * Corresponde ao valor da area da loja
 */
private double area;

/**
 * Nome da loja
 */
private String nome;

/**
 * Valor da renda fixa atribuida a todas as lojas
 */
private static double rendaFixa = 200;
/**
 * Área por omissão das lojas
 */
private static final double AREA_POR_OMISSAO = 0;

/**
 * Nome por omissão das lojas
 */
private static final String NOME_POR_OMISSAO = "sem nome";
/**
 * clasificação inferior por omissão dda loja
 */
private static final int CLASSIFICACAO_INFERIOR = 20;

/**
 * Classificação superior por omissão da loja
 */
private static final int CLASSIFICACAO_SUPERIOR = 100;

/**
 * dividendo da àrea para calcular a renda a pagar
 */
private static final int DIVIDENDO_DE_AREA = 100;

/**
 * Classificação da loja
 */
enum Classificacao {
    /**
     * classificação pequena
     */
    pequena(),
    /**
     * classificação média
     */
    media(),
    /**
     * classificação grande
     */
    grande();
}

/**
 * Instância uma instância Loja recebendo como parametro um double area e
 * uma String nome
 *
 * @param area Área da loja
 * @param nome Nome da loja
 */
public Loja(double area, String nome) {
    setArea(area);
    setNome(nome);
}

/**
 * construtor copia que leva como parametro ums instâncoa de Loja copiando
 * os atributos dessa instância para uma nova instância de Loja(area, nome)
 *
 * @param loja loja que servirá para clonar os atributos para construir uma
 * nova loja.
 */
public Loja(Loja loja) {
    setArea(loja.getArea());
    setNome(loja.getNome());
}

/**
 * Construtor que não recebe parâmetros logo usa o valor por omissão
 */
public Loja() {
    setArea(AREA_POR_OMISSAO);
    setNome(NOME_POR_OMISSAO);
}

/**
 * Método que retorna o valor da área
 *
 * @return area da loja
 */
public double getArea() {
    return area;
}

/**
 * método qeu retorna o nome da loja
 *
 * @return Nome da loja
 */
public String getNome() {
    return nome;
}

/**
 * Método que retorna o valor da renda fixa da loja
 *
 * @return valor da renda fixa
 */
public double getRendaFixa() {
    return rendaFixa;
}

/**
 * Método que retorna a classificação da loja
 *
 * @return classificação da loja
 */
public Classificacao getClassificacao() {
    if (area < CLASSIFICACAO_INFERIOR) {
        return Classificacao.pequena;
    } else if (area > CLASSIFICACAO_SUPERIOR) {
        return Classificacao.grande;
    }
    return Classificacao.media;

}

/**
 * Método que permite a alteração do valor da área
 *
 * lança uma excessão do tipo IllegalArguemntException caso a area seja
 * invalida ou seja: area menor que a area minima de loja(<5>)
 *
 * @param area Área da loja
 */
public void setArea(double area) {
    this.area = area;
}

/**
 * Método que permite alteração do nome da loja
 *
 * @param nome Nome da loja
 */
public void setNome(String nome) {
    this.nome = nome;
}

/**
 * Método toString que imprime na consola os atributos da loja
 *
 * @return String com valores da loja
 */
@Override
public String toString() {
    return String.format("Nome da loja: %s%nArea da loja: %f  Renda Fixa: %f €%n",
            area, rendaFixa, nome);
}

/**
 * Método que calcula a arenda a pagar pela loja
 *
 * Para ser especificado nas subclasses
 *
 * não usado polimorfismo na classe Quiosque porque classe têm o seu próprio
 * valor de renda a pagar
 *
 * @return valor da renda a pagar pela loja
 */
public double calcularRendaAPagar() {
    return rendaFixa * (1 + area / DIVIDENDO_DE_AREA);
}

has subclass Lojacomum and Lojaancora:

public abstract class LojaComum extends Loja {

/**
 * quantidade de funcionários de qualquer entidade de LojaComum
 */
private int qtdFuncionarios;

/**
 * número de instâncias criadas de qualquer LojaComum, quer seja Restauracao
 * ou Quiosque
 */
private static int nInstancias = 0;

/**
 * quantidade de funcionários de uma entidade de LojaComum por omissão
 */
private static final int QTD_FUNCIONARIOS_POR_OMISSAO = 0;

/**
 * Cria uma instância de Lojacomum recebendo como parametro a area,
 * rendaFixa e qtdFuncionários
 * 
 * incrementa nInstâncias em +1
 *
 * @param area Area da Loja comum
 * @param qtdFuncionarios quantidade de funcionários da loja Comum
 * @param nome o nome da lojaComum
 */
public LojaComum(int qtdFuncionarios, double area, String nome) {
    super(area, nome);
    setQtdFuncionarios(qtdFuncionarios);
    nInstancias++;
}

/**
 * Consturtor copia que cria uma instância de Lojacomum recebendo uma
 * LojaComum como parametro
 *
 * Cria um novo Objeto com a area, nome e qtdFuncionários do objeto
 * Lojacomum para a nova instãncia
 * 
 * incrementa nInstâncias em +1
 *
 */
public LojaComum(LojaComum lojaComum) {
    setArea(lojaComum.getArea());
    setNome(lojaComum.getNome());
    setQtdFuncionarios(lojaComum.getQtdFuncionarios());
    nInstancias++;
}

/**
 * Cria uma instância de LojaComum com o nome e area por omissão da super
 * criando também quantidade de funcionãrios por omissão
 * 
 * incrementa nInstâncias em +1
 */
public LojaComum() {
    super();
    qtdFuncionarios = QTD_FUNCIONARIOS_POR_OMISSAO;
    nInstancias++;
}

/**
 * retorna a quantidade de funcionários duma Loja comum
 *
 * @return quantidade de funcionários
 */
public int getQtdFuncionarios() {
    return qtdFuncionarios;
}

/**
 * permite obter o número de isntancias criadas
 *
 * @return número de instâncias criadas
 */
public static int getnInstancias() {
    return nInstancias;
}

/**
 * define a quantidade de funcionários duma lojaComum
 *
 * @param qtdFuncionarios quantidade de funcionários
 */
public void setQtdFuncionarios(int qtdFuncionarios) {
    this.qtdFuncionarios = qtdFuncionarios;
}

/**
 * retorna uma String com atributos de LojaComum
 *
 * @return String com atributos de LojaComum
 */
@Override
public String toString() {
    return "LojaComum{" + "qtdFuncionarios=" + qtdFuncionarios + '}';
}


}

anchor shop:

public abstract class LojaAncora extends Loja implements Seguranca {

/**
 * Custo de segurança de cada loja
 */
private double custoSeguranca;

/**
 * Número de instâncias criadas
 */
private static int nInstancias = 0;

/**
 * Valor por omissão do custo de segurança de cada loja
 */
private static final double CUSTO_SEGURANCA_POR_OMISSAO = 0;

/**
 * Construtor que recebe como parâmetro, além do da super classe, o custo de
 * segurança da loja; inclui contador do número de instâncias de lojas
 * âncora
 *
 * incrementa nInstâncias em +1
 * 
 * @param area a area da loja ancora
 * @param nome o nome a loja an cora
 * @param custoSeguranca o custo de segurança da loja ancora
 */
public LojaAncora(double area, String nome, double custoSeguranca) {
    super(area, nome);
    setCustoSeguranca(custoSeguranca);
    nInstancias++;
}

/**
 * construtor copia que instância LojaAncora apartir de outra instância de
 * LojaAncora
 *
 * definindo a area, nome e custo de seguranca da LojaAncora que vai ser
 * copiada
 *
 * incrementa nInstâncias em +1
 * 
 * @param lojaAncora instância de lojaAncora que servirá como parametro
 */
public LojaAncora(LojaAncora lojaAncora) {
    setArea(lojaAncora.getArea());
    setNome(lojaAncora.getNome());
    setCustoSeguranca(lojaAncora.getCustoSeguranca());
    nInstancias++;
}

/**
 * instância LojaAncora com a area e nome por omissão da classe Loja
 * @see Loja
 * 
 * define o custo de seguranca por omissao
 * 
 * incrementa nInstancias por 1
 * 
 */
public LojaAncora() {
    super();
    setCustoSeguranca(CUSTO_SEGURANCA_POR_OMISSAO);
    nInstancias++;
}

/**
 * Método que retorna o custo de segurança da loja
 *
 * @return custo de segurança da loja
 */
public double getCustoSeguranca() {
    return this.custoSeguranca;
}

/**
 * Método que retorna o número de instâncias de lojas âncora
 *
 * @return número de instâncias criadas
 */
public static int getNInstancias() {
    return nInstancias;
}

/**
 * Método que permite alterar o custo de segurança da loja
 *
 * @param custoSeguranca
 */
public void setCustoSeguranca(double custoSeguranca) {
    this.custoSeguranca = custoSeguranca;
}

/**
 * Método que cria uma string com as características da loja
 *
 * @return além das caracteristicas que imprime o método toString da super
 * classe, retorna também o custo de segurança
 */
@Override
public String toString() {
    return String.format("%sCusto de Segurança: %f €%n ", super.toString(),
            this.custoSeguranca);
}

}

Own:

 public class Restauracao extends LojaComum implements Seguranca {

/**
 * custo da manutenção do restaurante
 */
private double custoManutencao;

/**
 * recceitas anuais do restaurante
 */
private double receitasAnuais;

/**
 * Custo de segurança da Loja Restauracao
 */
private double custoSeguranca;

/**
 * quantidade de mesas do restaurante
 */
private int qtdMesas;

/**
 * custo de manutenção por omissão do restaurante
 */
private static final double CUSTO_MANUTENCAO_POR_OMISSAO = 0;

/**
 * receitas anuais por omissão do restaurante
 */
private static final double RECEITAS_ANUAIS_POR_OMISSAO = 0;

/**
 * quantidade de mesas do restaurante por omissão
 */
private static final int QTD_MESAS_POR_OMISSAO = 0;

/**
 * dividendo das receitas anuais para calcular a renda a pagar
 */
private static final int DIVIDENDO_DE_RECEITAS = 100;

/**
 * custo por mesa a pagar na segurança
 */
private static final int CUSTO_POR_MESA = 10;

/**
 * cria uma instância de Restaurante recebendo como parametro o custo da
 * manutenção, receitas anuais e a quantidade de mesas
 *
 * incrementa por +1 o valor de nInstancias em LojaComum
 *
 * @see LojaComum
 *
 * @param custoManutencao o custo da manutenção do restaurante
 * @param receitasAnuais as receitas anuais do restaurante
 * @param qtdMesas a quantidade de mesas do restaurante
 * @param area a area do restaurante
 * @param qtdFuncionarios a quantidade de funcionários do restaurante
 */
public Restauracao(double custoManutencao, double receitasAnuais, int qtdMesas,
        double area, String nome, int qtdFuncionarios, double custoSeguranca) {
    super(qtdFuncionarios, area, nome);
    setCustoManutencao(custoManutencao);
    setReceitasAnuais(receitasAnuais);
    setReceitasAnuais(receitasAnuais);
    setQtdMesas(qtdMesas);
}

/**
 * instância uma nova loja Restauracao copiando os atributos do objeto copia
 * Restauracao
 *
 * definindo apartir do objeto copia restauracao o custo de manutencao,
 * receitas anuais, quantidade de mesas, area, nome, quantidade de
 * funcionarios e custo de seguranca
 *
 * incrementa por +1 o valor de nInstancias em LojaComum
 *
 * @see LojaComum
 *
 * @param restaurante Restaurante que servirá como cópia para a nova
 * instância
 */
public Restauracao(Restauracao restaurante) {
    setCustoManutencao(restaurante.getCustoManutencao());
    setReceitasAnuais(restaurante.getReceitasAnuais());
    setQtdMesas(restaurante.getQtdMesas());
    setArea(restaurante.getArea());
    setNome(restaurante.getNome());
    setQtdFuncionarios(restaurante.getQtdFuncionarios());
    setCustoSeguranca(restaurante.getCustoSeguranca());
}

/**
 * cria uma instância de restaurante com os valores por omissão
 *
 */
public Restauracao() {
    super();
    custoManutencao = CUSTO_MANUTENCAO_POR_OMISSAO;
    receitasAnuais = RECEITAS_ANUAIS_POR_OMISSAO;
    qtdMesas = QTD_MESAS_POR_OMISSAO;
}

/**
 * devolve o custo de manutencao do restaurante
 *
 * @return custo de manutencao do restaurante
 */
public double getCustoManutencao() {
    return custoManutencao;
}

/**
 * devolve receitas anuais do restaurante
 *
 * @return receitas anuais do restaurante
 */
public double getReceitasAnuais() {
    return receitasAnuais;
}

/**
 * devolve o custo de seguranca do restaurante
 *
 * @return custo de seguranca do restaurante
 */
public double getCustoSeguranca() {
    return custoSeguranca;
}

/**
 * devolve a quantidade de mesas do restaurante
 *
 * @return a quantidade de mesad do restaurante
 */
public int getQtdMesas() {
    return qtdMesas;
}

/**
 * define o custo de manutencao do restaurante
 *
 * @param custoManutencao custo de manutencao do restaurante
 */
public void setCustoManutencao(double custoManutencao) {
    this.custoManutencao = custoManutencao;
}

/**
 * defien as recitas nuais do restaurante
 *
 * @param receitasAnuais receitas anuais do restaurante
 */
public void setReceitasAnuais(double receitasAnuais) {
    this.receitasAnuais = receitasAnuais;
}

/**
 * define o custo de seguranca do restaurante
 *
 * @param custoSeguranca custo de seguranca do do restaurante
 */
public void setCustoSeguranca(double custoSeguranca) {
    this.custoSeguranca = custoSeguranca;
}

/**
 * define a quantidade de mesas do restaurante
 *
 * @param qtdMesas quantidade de mesas do restaurante
 */
public void setQtdMesas(int qtdMesas) {
    this.qtdMesas = qtdMesas;
}

/**
 * Devolve uma String com atributos de restauracao
 *
 * @return String com atributos de restaruacao
 */
@Override
public String toString() {
    return "Restauracao{" + "custoManutencao=" + custoManutencao
            + ", receitasAnuais=" + receitasAnuais + ", qtdMesas="
            + qtdMesas + '}';
}

/**
 * calcula a renda a pagar pelo restaurante
 *
 * @return um valor, double, a pagar pelo restaurante
 */
@Override
public double calcularRendaAPagar() {
    return super.calcularRendaAPagar()
            + (receitasAnuais / DIVIDENDO_DE_RECEITAS);

}

/**
 * retorna o custo da segurança a pagar a empresa
 *
 * @return custo da segurança a pagar a empresa
 */
@Override
public double calcularCustoSeguranca() {
    return custoSeguranca * CUSTO_POR_MESA * qtdMesas;
}


}

kiosk:

 public class Quiosque extends LojaComum {

/**
 * A renda dum quiosque que é igual para todas as instância de Quiosque
 */
private static double renda = 200;

/**
 * Cria uma instância de Quiosque recebendo como parametro a àrea, renda
 * fixa e a quantidade de funcionários
 *
 * @param area A área do quiosque
 * @param qtdFuncionarios
 */
public Quiosque(int qtdFuncionarios, double area, String nome) {
    super(qtdFuncionarios, area, nome);
}

/**
 * Instância Quiosque com area, nome e quantidade de funcionarios por
 * omissao
 *
 */
public Quiosque() {
    super();
}

/**
 * Cria uma String com os atributos de Quiosque
 *
 * @return String com atributos de Quiosque
 */
@Override
public String toString() {
    return "Quiosque{" + '}';
}

/**
 * Método que calcula a renda a pagar
 *
 * @return renda a pagar pelo quiosque
 */
@Override
public double calcularRendaAPagar() {
    return renda;
}

}

these two classes are subclasses of LojaComum the following are subclasses of Lojaancora:

 public class Propria extends LojaAncora {

/**
 * Número de instâncias criadas Iniciado a 0
 */
private static int nInstancias = 0;

/**
 * Construtor igual ao implementado na classe LojaAncora; inclui contador do
 * número de instâncias de lojas âncora próprias
 *
 * incrementa nInstancias por +1
 *
 * @param area a area da loja Ancoa propria
 * @param nome o nome da Loja Ancora propria
 * @param custoSeguranca o custo de segurânça da loja ancora proprai
 */
public Propria(double area, String nome, double custoSeguranca) {
    super(area, nome, custoSeguranca);
    nInstancias++;
}

/**
 * Construtor copia que recebe uma loja Propria, propria
 *
 * define a area, nome e custo de seguranca da instância propria que que
 * servirá como copia para a nova instância
 *
 *
 * incrementa nInstancias por +1
 *
 * @param propria Loja Propria que serve como cópia para a nova instâcia de
 * Propria
 *
 */
public Propria(Propria propria) {
    setArea(propria.getArea());
    setNome(propria.getNome());
    setCustoSeguranca(propria.getCustoSeguranca());
    nInstancias++;
}

/**
 * Construtor que insancia Propria com a area, e nome por omissão da Loja e
 * custo de seguranca por omissão
 *
 * incrementa nInstancias por +1
 *
 */
public Propria() {
    super();
    nInstancias++;
}

/**
 * Método que retorna o número de instâncias de lojas âncora próprias
 *
 * @return número de instâncias criadas
 */
public static int getNInstancias() {
    return nInstancias;
}

/**
 * Método que cria uma string com as características da loja
 *
 * @return além das características que o método toString da super classe
 * imprime, também retorna o valor da renda
 */
@Override
public String toString() {
    return String.format("%sRenda: %f €%n", super.toString(),
            getRendaFixa());
}

/**
 * devolveo custo de seguranca a pagar ao Centro comercial
 * 
 * @return custo de seguranca
 */
@Override
public double calcularCustoSeguranca() {
    return getCustoSeguranca();
}

}

and:

 public class Externa extends LojaAncora {

/**
 * Quantidade de funcionários da loja
 */
private int qtdFuncionarios;

/**
 * Valor de receitasAnuais do ano anterior
 */
private double receitasAnuais;

/**
 * Desconto em percentagem da renda
 */
private double desconto;

/**
 * Número de instâncias criadas (neste contexto corresponde ao números de
 * lojas âncora externas criadas
 */
private static int nInstancias = 0;

/**
 *
 */
private static final double DESCONTO_POR_OMISSAO = 0;

/**
 * Valores das constantes de funcionários por omissão, valor das
 * receitasAnuais anuais por omissão, dividendo de area e dividendo de
 * receitasAnuais
 */
private static final int DIVIDENDO_DE_RECEITAS_ANUAIS = 100;
private static final int QTD_FUNCIONARIOS_POR_OMISSAO = 0;
private static final int RECEITAS_POR_OMISSAO = 0;

/**
 * Construtor que recebe como parâmetros, além dos da super classe, a
 * quantidade de funcionários e o valor das receitasAnuais anuais
 *
 * @param area
 * @param custoSeguranca
 * @param qtdFuncionarios
 * @param receitasAnuais
 * @param desconto
 */
public Externa(double area, String nome, double custoSeguranca,
        int qtdFuncionarios, double receitasAnuais, double desconto) {
    super(area, nome, custoSeguranca);
    setQuantidadeFuncionarios(qtdFuncionarios);
    setReceitas(receitasAnuais);
    setDesconto(desconto);
    nInstancias++;
}

/**
 * Construtot que não recebe nenhum parâmetro e usa os valores das
 * constantes por omissão
 */
public Externa() {
    super();
    qtdFuncionarios = QTD_FUNCIONARIOS_POR_OMISSAO;
    receitasAnuais = RECEITAS_POR_OMISSAO;
    desconto = DESCONTO_POR_OMISSAO;
    nInstancias++;
}

/**
 * Método que retorna a quantidade de funcionários da loja
 *
 * @return quantidade de funcionários da loja
 */
public int getQuantidadeFuncionarios() {
    return qtdFuncionarios;
}

/**
 * Método que retorna o valor das receitasAnuais do ano anterior
 *
 * @return valor das receitasAnuais do ano anterior
 */
public double getReceitas() {
    return receitasAnuais;
}

public double getDesconto() {
    return desconto;
}

/**
 * Método para obter o número de instâncias
 *
 * @return número de instâncias criadas
 */
public static int getNInstancias() {
    return nInstancias;
}

/**
 * Método que permite alterar a quantidade de funcionários
 *
 * @param qtdFuncionarios
 */
public void setQuantidadeFuncionarios(int qtdFuncionarios) {
    this.qtdFuncionarios = qtdFuncionarios;
}

/**
 * Método que permitr alterar o valor das receitasAnuais
 *
 * @param receitasAnuais
 */
public void setReceitas(double receitasAnuais) {
    this.receitasAnuais = receitasAnuais;
}

/**
 * Define o Desconto da loja Ancora Externa
 *
 * @param desconto Desconto da LojaAncoraExterna
 */
public void setDesconto(double desconto) {
    this.desconto = desconto;
}

/**
 * Método que cria uma string com a quantidade de funcionários e o valor das
 * receitasAnuais anuais
 *
 * @return quantidade de funcionários e receitasAnuais
 */
@Override
public String toString() {
    return String.format("%sQuantidade de funcionários: %d Receitas Anuais: "
            + "%f €%n", super.toString(), this.qtdFuncionarios,
            this.receitasAnuais);
}

/**
 * Método para o cálculo da renda das lojas âncora externas
 *
 * @return o valor final da renda da loja
 */
@Override
public double calcularRendaAPagar() {
    return super.calcularRendaAPagar()
            + (receitasAnuais / DIVIDENDO_DE_RECEITAS_ANUAIS);
}

/**
 * devolve o custo da seguranca a pagar pela loja Externa
 *
 * @return custo da segurança a pagar pela loja externa
 */
@Override
public double calcularCustoSeguranca() {
    return (1 - desconto) * getCustoSeguranca();
}

}

and the interface

 public interface Seguranca {

/**
 * método abstrato que calcula o custo de segurança a pagar ao centro
 * comercial
 *
 * para ser implementado em:
 *
 * >LojasAncora >Restauracao
 *
 * @return O custo a pagar ao CentroComercial. Custo a pagar depende do
 * número de mesas caso esta tenha
 */
double calcularCustoSeguranca();
 }

I even tried to implement an interface

public interface ReceitasTotais {

/**
 *
 * @return
 */
double receitasTotais();
}

in Loja and another Centrocomercial class that both have this method. but in no way the classes quiosque, Restaurante... "call" the method receitasTotais()

  • That code doesn’t make any sense out there like that. Present one of the classes you inherit from Loja and demonstrate the way you use the method in them, so it is easier to see the problem.

  • @Sorry for the delay, I went to sleep. this is the code I have

  • 1

    problem is that subclasses do not "ask" the super method - Can you explain what you mean by that? You’re talking about the builder super()?

  • No. I get it. I wanted to force a basic implementation into the super class that is universal to all classes and then a specific implementation in each class. I thought the classes would give error without having this method

1 answer

0

This is the standard behavior of language.

Note that compel a subclass calling the super is considered an anti-standard in some languages. This article (in English) by Martin Fowler talks about the subject and presents alternatives.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.