2013-03-26 72 views
5

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

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

杜梅因包;

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; 
    } 


} 

有人谁可以帮我吗? 在此先感谢。

+1

很明显,我们需要看代码。 – 2013-03-26 07:40:05

回答

2

由NPE上面给出的答案是绝对着手解决这个问题的最好办法。它是优雅的,并且尊重超类和子类之间的基本继承契约。甚至在你原来的职位,子类其实比超更严格,这样做是这样的:

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

完全一样NPE建议可能会工作。 (注意:我如何修改您的if测试。不知道这是一个错字,但在原来的执行5将是一个有效的最低,但输入像4将其设置为6

其他(可能是可以接受的)模式将成为:

  1. 使您的父类中的成员protected,这将给予可见性。 (意识到您确实提到了private限制;仅提及此模式以提供更完整的全面答案。)
  2. 将验证逻辑委托给另一种方法(即非私有方法)。这样孩子可以覆盖验证方法。

现在到使用Java反射的(可能是不可接受的)模式:

@Override 
public void setMinimumVoorraad(int minimumVoorraad) { 

    try { 
     Field field = this.getClass().getSuperclass().getDeclaredField("minimumVoorraad"); 
     field.setAccessible(true); 

     if(minimumVoorraad <= 5) 
      field.set(this, 6); 
     else 
      field.set(this, minimumVoorraad); 

     field.setAccessible(false); 
    } 
    catch(NoSuchFieldException | IllegalAccessException e) { 
     // do something 
    } 
} 

值得一提的是,如果你从来没有这样做在你的整个生活中,你可能会为它的更好。它不仅完全违反所有合同,但它依靠硬编码的字符串做字段名称查找,其本身是非常痛苦的。但它确实存在。并没有好的答案(NPE以上给出)将是完整的,没有如何做一些事情的例子...

9

一种可能性是根据超类的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 
} 
+0

比我的更短,更清晰,+1 – 2013-03-26 07:42:04

+0

@ T.J.Crowder:谢谢编辑。 – NPE 2013-03-26 07:45:41

+0

谢谢,但我喜欢摆脱已经在我的超类中定义的条件。 – Energyfellow 2013-03-26 07:52:21