覆盖子类中的Setter

时间:2013-03-26 07:38:33

标签: java override setter getter-setter overrides

我在这里遇到了问题。我想从我的子类(子)中的超类(父类)的属性更改setter但是当我在我的子类中覆盖此方法时,我无法从supperclass访问我的私有属性。关键是,他们必须保持私密。

超类(问题:setMinimumVoorraad(int voorraad);)

package domein;

public abstract class Artikel implements Weegbaar
{
    private String omschrijving;
    private double prijs;
    private int aantalInStock;
    private int minimumVoorraad;

    public Artikel(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad)
    {
        this.setOmschrijving(omschrijving);
        this.setPrijs(prijs);
        this.setAantalInStock(aantalInStock);
        this.setMinimumVoorraad(minimumVoorraad);
    }

    @Override
    public String toString()
    {
        String output = String.format(" \n omschrijving: %s \n prijs:  %f \n In stock %d (minimumvoorraad = %d) \n", this.omschrijving, this.prijs, this.aantalInStock, this.minimumVoorraad);
        return output;
    }
//----Getters----
    public String getOmschrijving() {
        return omschrijving;
    }

    public double getPrijs() {
        return prijs;
    }

    public int getAantalInStock() {
        return aantalInStock;
    }

    public int getMinimumVoorraad() {
        return minimumVoorraad;
    }

//----Setters----
    public void setOmschrijving(String omschrijving) {
        this.omschrijving = omschrijving;
    }

    public void setPrijs(double prijs) {
        this.prijs = prijs;
    }

    public void setAantalInStock(int aantalInStock) {
        this.aantalInStock = aantalInStock;
    }

    public void setMinimumVoorraad(int minimumVoorraad) 
    {
        if(minimumVoorraad < 2)
            this.minimumVoorraad = 3;
        else
            this.minimumVoorraad = minimumVoorraad;
    }


}

子类

package domein;


public class Food extends Artikel
{

    private String houdbaarheidsDatum;
    private double nettoGewicht;

    public Food(String omschrijving, double prijs, int aantalInStock, int minimumVoorraad, String houdbaarheidsDatum, double nettoGewicht)
    {
        super(omschrijving, prijs, aantalInStock, minimumVoorraad);
        this.setHoudbaarheidsDatum(houdbaarheidsDatum);
        this.setNettoGewicht(nettoGewicht);
    }

    @Override
    public boolean isWeegbaar()
    {
        return true;
    }


//----Getters----
    public String getHoudbaarheidsDatum() {
        return houdbaarheidsDatum;
    }

    public double getNettoGewicht() {
        return nettoGewicht;
    }

//----Setters----
    public void setHoudbaarheidsDatum(String houdbaarheidsDatum) {
        this.houdbaarheidsDatum = houdbaarheidsDatum;
    }

    public void setNettoGewicht(double nettoGewicht) {
        this.nettoGewicht = nettoGewicht;
    }

    @Override
    public void setMinimumVoorraad(int minimumVoorraad) 
    {
        if(minimumVoorraad < 5)
            this.minimumVoorraad = 6;
        else
            this.minimumVoorraad = minimumVoorraad;
    }


}

有人可以帮助我吗? 提前谢谢。

2 个答案:

答案 0 :(得分:9)

一种可能性是根据超类的setter实现子类的setter(可能你有权访问它)。

例如,假设setter是setFoo,那么子类的版本可能是:

public void setFoo(Foo f) {

    // Do subclass stuff pre-setting, if any

    super.setFoo(f);

    // Do subclass stuff post-setting, if any
}

答案 1 :(得分:2)

NPE上面给出的答案绝对是解决这个问题的最好方法。它优雅并且尊重超类和子类之间的基本继承契约。即使在你的原始帖子中,子类实际上比超类更具限制性,所以做了类似的事情:

@Override
public void setMinimumVoorraad(int minimumVoorraad) 
{
    if(minimumVoorraad <= 5)
        super.setMinimumVoorraad(6);
    else
        super.setMinimumVoorraad(minimumVoorraad);
}
正如NPE建议的那样可能会起作用。 (请注意我是如何修改您的if测试。不确定它是否是拼写错误,但在原始实现中5将是有效的最小值,但像4这样的输入会将其设置为{{ 1}}。)

其他(可能接受的)模式是:

  1. 在您的父类6中创建成员,这将提供可见性。 (意识到您确实提到了protected限制;仅提及此模式以提供更完整的整体答案。)
  2. 将验证逻辑委托给另一个方法(非私有)。这样孩子就可以覆盖验证方法。
  3. 现在使用Java反射(可能是不可接受的)模式:

    private

    值得注意的是,如果你一生中从未这样做过,那么你可能会更好。它不仅完全打破所有合同,而且它依赖于硬编码的字符串来进行字段名称查找,这本身​​就非常痛苦。但确实存在。没有一个如何做某事的例子,没有一个好的答案(NPE上面已经给出)是完整的......