我在这里遇到了问题。我想从我的子类(子)中的超类(父类)的属性更改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;
}
}
有人可以帮助我吗? 提前谢谢。
答案 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}}。)
其他(可能接受的)模式是:
6
中创建成员,这将提供可见性。 (意识到您确实提到了protected
限制;仅提及此模式以提供更完整的整体答案。)现在使用Java反射(可能是不可接受的)模式:
private
值得注意的是,如果你一生中从未这样做过,那么你可能会更好。它不仅完全打破所有合同,而且它依赖于硬编码的字符串来进行字段名称查找,这本身就非常痛苦。但确实存在。没有一个如何不做某事的例子,没有一个好的答案(NPE上面已经给出)是完整的......