2013-03-26 9 views
5

में सेटर ओवरराइड करें मैं यहां एक समस्या से फंस गया हूं। मैं अपने सबक्लास (बच्चे) में सुपरक्लास (पैरेंट क्लास) से एक विशेषता से सेटटर को बदलना चाहता हूं, हालांकि जब मैं अपने उप-वर्ग में इस विधि को ओवरराइड करता हूं तो मैं सुपरपरक्लास से अपने निजी विशेषताओं तक नहीं पहुंच सकता। और मुद्दा यह है कि उन्हें निजी रहना है।सबक्लास

सुपर क्लास (समस्या: setMinimumVoorraad (पूर्णांक voorraad);)

पैकेज 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; 
    } 


} 

कोई है जो मेरी मदद कर सकते? अग्रिम धन्यवाद।

+1

स्पष्ट रूप से, हमें कोड देखने की आवश्यकता है। –

उत्तर

2

जवाब एनपीई से ऊपर दिए गए बिल्कुल इस समस्या को हल के बारे में जाने के लिए सबसे अच्छा तरीका है। यह superclass और subclass के बीच सुरुचिपूर्ण और सम्मान मूल विरासत अनुबंध है। यहां तक ​​कि अपनी मूल पोस्ट में, उपवर्ग सुपर क्लास की तुलना में वास्तव में अधिक प्रतिबंधात्मक है, इसलिए की तरह कुछ कर रही:

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

एनपीई सुझाव बिल्कुल के रूप में शायद काम करेगा। (ध्यान दें कि कैसे मैं अपने if परीक्षण संशोधित। सुनिश्चित नहीं हैं कि अगर यह एक टाइपो है, लेकिन मूल कार्यान्वयन में 5 एक मान्य न्यूनतम होगा, लेकिन इनपुट 4 है जैसे कि यह 6 करने के लिए सेट है।)

अन्य (संभवतः स्वीकार्य) पैटर्न होगा हो:

  1. सदस्यों को अपने अभिभावक वर्ग protected में बनाएं, जो दृश्यता प्रदान करेगा। (यह समझें कि आपने private प्रतिबंध का उल्लेख किया है; इस पैटर्न का पूरी तरह से एक संपूर्ण पूर्ण उत्तर प्रदान करने के लिए उल्लेख किया गया है।)
  2. सत्यापन विधि को किसी अन्य विधि (जो गैर-निजी है) को प्रतिनिधि दें। इस तरह बच्चा सत्यापन विधि को ओवरराइड कर सकता है।

और अब पर (शायद अस्वीकार्य) जावा प्रतिबिंब का उपयोग कर के पैटर्न के लिए:

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

यह ध्यान देने योग्य है कि यदि आप कभी नहीं कभी भी अपने पूरे जीवन में ऐसा आप शायद इसके लिए बेहतर होगा लायक है । न केवल पूरी तरह से सभी अनुबंधों को तोड़ता है, लेकिन यह फ़ील्ड नाम लुकअप करने के लिए हार्ड-कोडेड स्ट्रिंग्स पर निर्भर करता है, जो स्वयं में और बहुत दर्दनाक है। लेकिन यह अस्तित्व में है। और कोई अच्छा जवाब नहीं (पहले से ही एनपीई द्वारा दिया गया) उदाहरण के बिना कुछ उदाहरण करने के लिए पूरा होगा ...

9

सुपरक्लास के सेटटर (जो संभवतः, आपके पास पहुंच है) के संदर्भ में सबक्लास के सेटर को कार्यान्वित करना एक संभावना है।

उदाहरण के लिए, सेटर संभालने 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 –

+0

@ टीजेड्रोडर: संपादन के लिए धन्यवाद। – NPE

+0

धन्यवाद, लेकिन मुझे अपने सुपरक्लास में पहले से परिभाषित शर्तों से छुटकारा पाना पसंद है। – Energyfellow