2013-03-26 73 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