这是一个大学作业的问题。对于这个作业,我们必须尊重 Java 中的封装和继承。
现在需要了解的重要课程是:
客户类别
import java.util.EnumSet;
import java.util.List;
public class Cliente {
// Definicao de enum da localizacao
private enum Localizacao {
CONTINENTE,
ACORES,
MADEIRA;
}
private String nome;
private int numContribuinte;
private Localizacao localizacao;
public Cliente(String nome, int numContribuinte, Localizacao localizacao){
this.nome = nome;
this.numContribuinte = numContribuinte;
this.localizacao = localizacao;
}
public Cliente() {
}
public void setLocalizacao(Localizacao localizacao) {
this.localizacao = localizacao;
}
public void setNome(String nome) {
this.nome = nome;
}
public void setNumContribuinte(int numContribuinte) {
this.numContribuinte = numContribuinte;
}
public String getNome() {
return nome;
}
public int getNumContribuinte() {
return numContribuinte;
}
public Localizacao getLocalizacao() {
return localizacao;
}
public Localizacao[] getLocalizacoes(){
return Localizacao.values();
}
public void printDadosCliente() {
System.out.println("\n");
System.out.println("Dados do Cliente:");
System.out.println("Nome: " + nome);
System.out.println("Número de contribuinte: " + numContribuinte);
System.out.println("Localização do cliente: " + localizacao.name());
}
}
产品类:
public abstract class Produtos {
private int codigo;
private String nome;
private String descricao;
private int quantidade;
private double valorUnitario;
//Construtor
public Produtos(int codigo, String nome, String descricao, int quantidade, double valorUnitario){
this.codigo = codigo;
this.nome = nome;
this.descricao = descricao;
this.quantidade = quantidade;
this.valorUnitario = valorUnitario;
}
// Getters
public int getCodigo() {
return codigo;
}
public String getNome() {
return nome;
}
public String getDescricao() {
return descricao;
}
public int getQuantidade() {
return quantidade;
}
public double getValorUnitario() {
return valorUnitario;
}
public double getPrecoSemIva() {
return valorUnitario * quantidade;
}
// Abstract method to calculate IVA
public abstract double calculaIva(Cliente.Localizacao localizacao);
public abstract void printDadosProduto();
}
还有 ProdutoAlimentarNormal 类,它是 ProdutoAlimentar 的子类,ProdutoAlimentar 是 Produtos 的子类,但我省略了它,因为它只向类添加了一个变量 isBiologic 布尔值:
public class ProdutoAlimentarNormal extends ProdutosAlimentares {
public ProdutoAlimentarNormal(int codigo, String nome, String descricao, int quantidade, double valorUnitario, boolean isBiologico)
{
super(codigo, nome, descricao, quantidade, valorUnitario, isBiologico);
}
@Override
public double calculaIva(Cliente.Localizacao localizacao){
double taxaIva = 0.23;
if (localizacao.equals(Cliente.Localizacao.MADEIRA)){
taxaIva = 0.22;
} else if (localizacao.equals(Cliente.Localizacao.ACORES)) {
taxaIva = 0.16;
}
if (getBiologico()){
taxaIva *= 0.9;
}
return getQuantidade()* getValorUnitario() * taxaIva;
}
@Override
public void printDadosProduto(){
System.out.println("Dados do Produto:");
System.out.println("Tipo: Produto Alimentar");
if (getBiologico()){
System.out.print("Biologico: Sim");
} else {
System.out.print("Biologico: Não");
}
System.out.println("Taxa de IVA: Normal");
System.out.println("Nome do produto: " + getNome());
System.out.println("Código do produto: " + getCodigo());
System.out.println("Quantidade: " + getQuantidade());
System.out.println("Preço por unidade: " + getValorUnitario() + "€");
System.out.println("Preço total (s/ IVA): " + getValorUnitario() * getQuantidade() + "€");
}
}
如你所见,我已将
Localizacao
设置为私有:
// Definicao de enum da localizacao
private enum Localizacao {
CONTINENTE,
ACORES,
MADEIRA;
}
但是 produtosAlimentarNormal 上的 IVA 计算取决于这些值:
@Override
public double calculaIva(Cliente.Localizacao localizacao){
double taxaIva = 0.23;
if (localizacao.equals(Cliente.Localizacao.MADEIRA)){
taxaIva = 0.22;
} else if (localizacao.equals(Cliente.Localizacao.ACORES)) {
taxaIva = 0.16;
}
if (getBiologico()){
taxaIva *= 0.9;
}
return getQuantidade()* getValorUnitario() * taxaIva;
}
我尝试这样写,而是传递一个客户端,
@Override
public double calculaIva(Cliente cliente){
double taxaIva = 0.13;
if (cliente.getLocalizacao() == cliente.getLocalizacoes().NOVALUE){
taxaIva = 0.12;
} else if (localizacao.equals()) {
taxaIva = 0.16;
}
if (categoria == CategoriasAlimentar.VINHO){
taxaIva += 0.01;
}
if(getBiologico()){
taxaIva *= 0.9;
}
return getQuantidade()* getValorUnitario() * taxaIva;
}
但永远无法让 cliente.getLocalizacoes().NOVALUE 在 NOVALUE 空间中显示 ACORES、MADEIRA 或 CONTINENTE。
公开枚举是否不尊重封装? 我尝试了各种 getter 和 setter,但永远无法得到一个能够返回给我一些我可以在私有的情况下做的事情。 虽然它是公开的,但它就像一种魅力,但恐怕我不尊重封装。
类型。这也意味着枚举类。 如果该类型需要作为公共方法中的参数,那么该类型当然也必须是公共的。
您定义方法,例如:
Localizacao.ACORES
该公共方法采用
public double calculaIva ( Cliente.Localizacao localizacao ) { … }
对象。所以 Cliente.Localizacao
类也必须是公共的。作为一个枚举类是无关紧要的。
方法
Cliente.Localizacao
是否真的应该是calculaIva
是一个单独的问题。您应该始终选择适合您情况的尽可能窄的访问权限。请参阅 Oracle 的教程
。您可以通过使用 Java 平台模块系统 (JPMS) 进一步减少访问。