2010-08-30 11 views
7

मैं इस समस्या के वेरिएंट के लिए वापस आते रहते हैं: यह शायद एक बहुत ही सरल समाधान है, लेकिन मैं यह पता लगा नहीं कर पा रहे ...रिटर्निंग उपवर्ग वस्तु

मैं वर्गों का एक समूह है फॉर्म xQuantity, उदाहरण के रूप में DistanceQuantity, AreaQuantity, आदि, जो कक्षा DimensionQuantity का विस्तार करता है। अब आप दूरस्थ क्वांटिटी या एरियाक्वैंटिटी इत्यादि को जोड़ या घटा सकते हैं, लेकिन आप उन्हें मिश्रण नहीं कर सकते हैं, इसलिए मुझे लगता है कि मुझे सबक्लास में विधियों को जोड़ने, घटाने, घटाने आदि की आवश्यकता है, लेकिन मैं किसी भी तर्क को कम करना चाहता हूं न्यूनतम करने के लिए नकल। हालांकि, मुझे उप-वर्ग की वस्तु वापस करने की आवश्यकता है, और सुपरक्लास विधि से ऐसा करना मुश्किल लगता है। मेरा मानना ​​है कि यह प्रतिबिंब का उपयोग करके किया जा सकता है, लेकिन AFAIK आपको अभी भी उप-वर्ग विधि में अंत में एक कलाकार करना है, और मुझे बताया गया है कि प्रतिबिंब महंगा हो सकता है ... सबसे अच्छा मैं अब तक आया हूं:

DistanceQuantity में (और अन्य इसी तरह के):

public DistanceQuantity() {  
} 

public DistanceQuantity add(DistanceQuantity d1) { 
    DistanceQuantity dn = new DistanceQuantity(); 
    Object o = super.add(dn, this, d1, DistanceUnit.REF_UNIT); 
    return (DistanceQuantity) o; 
} 

DimensionQuantity में (ऋण कुछ कम प्रासंगिक बयानों):

public Object add(DimensionQuantity dn, DimensionQuantity d1, DimensionQuantity d2, 
    AbstractUnit au) { 
    dn.unit = au; 
    dn.scalar = d1.scalar + d2.scalar; 
    dn.units = dn.scalar;  
    return dn; 
} 

किसी leaner कोड के साथ आ सकते हैं - कि अभी भी type- है सुरक्षित? TIA

उत्तर

8

आप जेनेरिक्स इस तरह उपयोग कर सकते हैं:

public abstract class DimensionQuantity<T extends DimensionQuantity>{ 
    public abstract T add(T parameter); 
} 

और आप इसे इस तरह से लागू होता है:

public class DistanceQuantity extends DimensionQuantity<DistanceQuantity>{ 
    public DistanceQuantity add(DistanceQuantity parameter){ 
     //Whatever 
     return null; 
    } 
} 

और प्रारंभिक प्रश्न के लिए, यह एक वास्तव में बुरा विचार है (और एक बुरा अभ्यास) एक सुपरक्लास है जो इसके उप-वर्गों में से एक का उपयोग करता है।


संसाधन:

एक ही विषय पर:

+0

जेनिक्स को T_DimensionQuantity – Egwor

+0

के करीब कुछ नाम देने के लिए यह बेहतर है (स्पष्ट होने के बाद आपके पास बहुत सारे जेनेरिक हैं) आप अमूर्त कीवर्ड भूल गए हैं। ;) बस 'टी' का उपयोग करना मुझे लगता है कि मानक मानक अभ्यास है। – Michael

+0

@mangst धन्यवाद, यह अब सार है। @Egwor, जैसे @ mangst ने कहा, टी आम है। टाइप के लिए टी, संग्रह में यह ई के लिए तत्व है, मानचित्र में यह कुंजी और मान के लिए के और वी है। आमतौर पर यह आपके जेनेरिक अर्थ का पहला अक्षर है। –

0

जावा 6 में, आप ऐसा कुछ करने का प्रयास कर सकते हैं।

public abstract class DimensionQuantity { 

    protected int quantity; 

    public DimensionQuantity (int quantity) { 
     this.quantity = quantity; 
    } 

    public abstract DimensionQuantity add(DimensionQuantity dq); 
} 

public class DistanceQuantity extends DimensionQuantity { 

    public DistanceQuantity(Quantity quantity) { 
     super(quantity); 
    } 

    /* 
    * A sub-class as return type is authorized. 
    * If dq is not a DistanceQuantity, a ClassCastException is thrown, but you can change this. 
    */ 
    @Override 
    public DistanceQuantity add(DimensionQuantity dq) throws ClassCastException { 
     return new DistanceQuantity(this.quantity + (DistanceQuantity) dq.quantity); 
    } 
} 
+0

लेकिन अब आप अपनी दूरी मात्रा में एक क्षेत्र क्वांटिटी जोड़ सकते हैं। –

+0

हां, लेकिन इसके परिणामस्वरूप क्लासकास्ट अपवाद होगा। तो यह क्रिया निषिद्ध है और जल्दी से पता लगाया जाएगा (लेकिन रनटाइम पर और संकलन नहीं)। –

+0

यह वास्तव में खतरनाक है, और यदि आप अपनी दूरी मात्रा को आयाम मात्रा में डाल देते हैं तो आप यह भी नहीं जानते कि सीसीई को जोखिम के बिना क्या करना है। –

0

आयाम के लिए एक enum बनाएँ::

सार्वजनिक enum आयाम {क्षेत्र, दूरी, ...}

फेंक दूर अपने उपवर्गों लेकिन जेनरिक का उपयोग कर भी एक अच्छा विचार है। इसके बजाय केवल DimensionQuantity ऑब्जेक्ट्स बनाएं, और प्रत्येक को एक (अपरिवर्तनीय) आयाम बनाने के लिए मजबूर करें, समय पर सेट करें।

आयाम क्वांटिटी में अतिरिक्त कार्यान्वयन, पहले जांच कर रहा है कि दो मात्राओं के आयाम समान हैं।

वोला! कम वर्ग, सुरक्षा प्रकार, कोई डुप्लिकेट कोड।

+0

"पहली बार जांच कर रहा है कि दो मात्राओं के आयाम समान हैं।" - यह मेरे लिए रन-टाइम की तरह लगता है! –

संबंधित मुद्दे