2014-05-23 7 views
15

मैं एक सार श्रेणी श्रेणी को परिभाषित करने की कोशिश कर रहा हूं जो कई श्रेणी वर्गों के मूल कार्यान्वयन के रूप में कार्य करेगा। इच्छित उपयोग इस प्रश्न के लिए अप्रासंगिक है, लेकिन अभी तक मेरे पास है:डिफ़ॉल्ट मान के साथ सार वर्ग

/** 
* Abstract generic utility class for handling ranges 
*/ 
public abstract class Range<T extends Number> { 

    // Variables to hold the range configuration 
    private T start; 
    private T stop; 
    private T step; 

    /** 
    * Constructs a range by defining it's limits and step size. 
    * 
    * @param start The beginning of the range. 
    * @param stop The end of the range. 
    * @param step The stepping 
    */ 
    public Range(T start, T stop, T step) { 
    this.start = start; 
    this.stop = stop; 
    this.step = step; 
    } 
} 

अब मुझे लगता है कि केवल start और stop लेता है के साथ एक निर्माता जोड़ना चाहते हैं, और 1 की डिफ़ॉल्ट कदम मूल्य निर्धारित करता है, कोई बात नहीं क्या कार्यान्वयन Number की T है (उदाहरण के लिए यदि TInteger[one] मूल्य 1 है, और अगर T है Long[one] मूल्य 1L होता, और इतने पर है)। मैं कुछ ऐसा करना चाहते हैं:

protected Range(T start, T stop) { 
    this(start, stop, [one]); 
} 

लेकिन मैं समझ नहीं कैसे इतना [one] का मूल्य निर्धारित किया है। के बाद से जावा अभी भी काफी मेरे लिए नया है, मैं के साथ की कोशिश की है:

private static final T one = 1; 

जो क्योंकि T जाहिर Range.this की इन्स्टेन्शियशन में परिभाषित किया गया है काम नहीं करता। इसके अलावा, मैं कोशिश की है:

protected static abstract T getOne(); 

क्योंकि TRange.this प्लस static और abstract की इन्स्टेन्शियशन में परिभाषित किया गया है एक साथ काम नहीं करते जो भी काम नहीं करता।

मुझे [one] के मूल्य को परिभाषित करने के लिए कक्षाओं को विस्तारित करने के लिए कुछ तरीकों की आवश्यकता है, इससे कोई फर्क नहीं पड़ता कि NumberRange के कार्यान्वयन के लिए क्या लागू किया गया है।

अंत में मैं भी डिफ़ॉल्ट शुरुआत के रूप में एक शून्य मान, सेट करना चाहते हैं इस तरह मैं एक निर्माता है कि इस तरह दिखता है मिलता है कि:

protected Range(T stop) { 
    this([zero], stop, [one]); 
} 
+2

मुझे यकीन है कि संख्या का उपयोग करने के लिए सही सुपरक्लास है। इस विषय पर दिलचस्प सवाल है: http://stackoverflow.com/questions/2721390/how-to-add-two-java-lang-numbers - मेरा मतलब है कि अगर आप इसे समझते हैं, तो आप कैसे कदम जोड़ देंगे सीमा से फिर से शुरू करना शुरू करें? –

+1

'यह (प्रारंभ, रोकें, (टी) (नया इंटीजर (1)));' –

उत्तर

15

एक समाधान का उपयोग करने के लिए डिफ़ॉल्ट कदम के लिए उपवर्गों पूछने के लिए होगा :

public abstract class Range<T extends Number> { 

    private T start; 
    private T stop; 
    private T step; 

    public Range(T start, T stop, T step) { 
     this.start = start; 
     this.stop = stop; 
     this.step = step; 
    } 

    protected Range(T start, T stop) { 
     this.start = start; 
     this.stop = stop; 
     this.step = getDefaultStep(); 
    } 

    protected abstract T getDefaultStep(); 

} 

public class IntegerRange extends Range<Integer> { 

    public IntegerRange(Integer start, Integer stop, Integer step) { 
     super(start, stop, step); 
    } 

    public IntegerRange(Integer start, Integer stop) { 
     super(start, stop); 
    } 

    @Override 
    protected Integer getDefaultStep() { 
     return 1; 
    } 

} 

public class DoubleRange extends Range<Double> { 

    public DoubleRange(Double start, Double stop, Double step) { 
     super(start, stop, step); 
    } 

    public DoubleRange(Double start, Double stop) { 
     super(start, stop); 
    } 

    @Override 
    protected Double getDefaultStep() { 
     return 1d; 
    } 

} 
+0

बूम! त्वरित उत्तर के लिए +1। –

+1

मैं दूसरा, हालांकि कि प्रत्येक कार्यान्वयन वर्ग को एक डिफ़ॉल्ट कदम प्रदान करना होगा, भले ही यह छोटे कन्स्ट्रक्टर का उपयोग न करे। – Smutje

+0

आप ऐसा नहीं कर सकते हैं। 'रेंज'getDefaultStep' को 'रेंज' से पहले नहीं बुलाया जा सकता है, और इस प्रकार आप इसे कन्स्ट्रक्टर में उपयोग नहीं कर सकते हैं। – beruic

5

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

protected Range(T start, T stop) { 
    this(start, stop, (T) (new Integer(1))); 
} 
+0

'इंटीगर' को 'डबल' जैसे अन्य उप-वर्गों में 'डबल' किया जा सकता है? – awksp

+0

हां; इसे परिवर्तित किया जा सकता है। –

+3

हू, यह दिलचस्प है ... क्यों वह कास्ट सफल होगा जब एक स्पष्ट कलाकार 'डबल डी = (डबल) नया इंटीजर (1);' संकलित भी नहीं? – awksp

2

आप में चला जाएगा एक और समस्याएं ... लेकिन यहां आपका नंबर 1:

Number ONE = new Number() { 
    @Override 
    public int intValue() { 
     return 1; 
    } 

    @Override 
    public long longValue() { 
     return 1L; 
    } 

    @Override 
    public float floatValue() { 
     return 1.0f; 
    } 

    @Override 
    public double doubleValue() { 
     return 1.0; 
    } 

    @Override 
    public byte byteValue() { 
     return 1; 
    } 

    @Override 
    public short shortValue() { 
     return 1; 
    } 
}; 
+0

अन्य समस्याओं पर विस्तार करने के लिए देखभाल? :) – beruic

+0

यह देखना दिलचस्प होगा कि आप सामान्य तरीके से सीमा से कैसे पुन: प्रयास करेंगे, मेरा मतलब है कि 'स्टार्ट' को 'स्टार्ट' में जोड़ना और इसे 'स्टॉप' के साथ कॉम्पैर करना है। आपको सबक्लास को 'तुलना (टी, टी)', 'ऐड (टी, टी)' आदि प्रदान करने की आवश्यकता हो सकती है लेकिन यह अच्छा IMHO नहीं दिखता :) दूसरी तरफ मुझे बेहतर समाधान नहीं दिख रहा है। .. –

+0

आप रेंज <टी विस्तार संख्या और तुलनात्मक> के साथ तुलनीय समस्या को हल कर सकते हैं, अंकगणितीय परिचालन अभी भी दर्दनाक होगा –

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