2012-03-09 9 views
6

संपादित करें: मैं इसे उदाहरण के रूप में यहां छोड़ दूंगा। अधिक जानकारी के लिए टिप्पणियां पढ़ें लेकिन आम तौर पर: इस डिजाइन का उपयोग न करें! यह बुरा है!जावा - कंक्रीट प्रकार

मैं अब थोड़ी देर के लिए एक जवाब के लिए खोज की है, लेकिन कुछ भी नहीं मिल सका वास्तव में विशिष्ट कहावत है, कोई आपको वजह से नहीं कर सकते हैं ... या हाँ आपको लगता है कि तुम कैसे करते है सकते हैं ..

तो सवाल है, मैं ऑब्जेक्ट प्रकार मानकों को परिभाषित एक सार विधि बना सकते हैं और फिर कुछ इस तरह पैरामीटर का एक ठोस प्रकार के साथ इसे लागू किया है:

public abstract class ToBeOverriden { 
    public Object method1 (Object parameter); 
    public String method2 (Object parameter); 
    public void method3 (Object parameter); 
} 

और फिर इस के साथ ओवरराइड:

public class Implementation { 
    @Override 
    public DateTime method1 (Person parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public String method2 (MotorCycle parameter){ 
     return new DateTime(); 
    } 

    @Override 
    public void method3 (String parameter){ 
     return new DateTime(); 
    } 
} 

जहां व्यक्ति मेरे द्वारा बनाई गई वस्तु है। वापसी का प्रकार जो भी हो सकता है। वर्तमान में मैं यह नहीं कर सकता। यह मुझे नहीं जाने देता है। मेरा अनुमान है कि ऐसा इसलिए है क्योंकि मेरी कक्षा वस्तु का विस्तार नहीं करती है। हालांकि सब कुछ ऑब्जेक्ट बढ़ाता है ... तो ...

या मुझे अपने जावा ज्ञान को रीफ्रेश करने की आवश्यकता है? :)

संपादित करें: एक और जटिल वर्ग संरचना जोड़ा गया।

धन्यवाद!

उत्तर

15

आप Java Generics का उपयोग करने की आवश्यकता होगी:

public abstract class ToBeOverriden<E,V> { 
    public E method (V parameter); 
} 

public class Implementation extends ToBeOverriden<DateTime,Person> { 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

जोड़ा गया:

E पैरामीटर ommited जा सकता है, कोड अभी भी संकलित कर देगा। हालांकि, अगर ToBeOverriden के विभिन्न कार्यान्वयन अलग-अलग रिटर्न प्रकारों का उपयोग करेंगे, तो मुझे लगता है कि E को बनाए रखना बेहतर है। लेकिन यह व्यक्तिगत स्वाद का मामला है - मुझे कोड में कहीं भी Object देखना पसंद नहीं है।

जोड़ा गया 2:

प्रश्न में अपने अद्यतन के बारे में के रूप में, आप हर विधि के लिए एक अलग सामान्य प्रकार है की आवश्यकता होगी। उदाहरण के लिए:

public abstract class ToBeOverriden<A,B,C> { 
    public Object method1 (A parameter); 
    public String method2 (B parameter); 
    public void method3 (C parameter); 
} 

हालांकि, आमतौर पर, जब आपको ऐसी भयानक संरचना की आवश्यकता होती है - तो आपका कोड गलत तरीके से डिज़ाइन किया गया है। 95% मामलों में 1 सामान्य प्रकार पैरामीटर पर्याप्त है। 4.9 9% मामलों में 2 जेनेरिक प्रकार पैरामीटर पर्याप्त हैं।

+1

* ई * की आवश्यकता नहीं है, केवल * वी * आवश्यक है। –

+0

@AmirPashazadeh आप सही हैं, ऐसा नहीं सोचते हैं। मेरा जवाब अपडेट किया गया। – bezmax

+0

क्या होगा यदि उसके पास एक रिटर्न प्रकार/पैरामीटर प्रकार है? फिर ई क्या होगा? – Hannibal

0

आप कर :) The spec का कहना है:

दो तरीकों में एक ही हस्ताक्षर है अगर वे एक ही नाम और तर्क प्रकार हैं।

आप आसानी से public Object method (Object parameter); और कंधे से अपनी कक्षा पक्ष में public Object method (Person parameter); हो सकता है, और इन अलग अलग तरीकों किया जाएगा।

और हाँ, सभी कक्षाएं अंततः Object का विस्तार करती हैं।

2

आप निम्न कर सकते हैं:

public abstract class ToBeOverriden<T> { 
    public Object method (T parameter); 
} 

public class Implementation extends ToBeOVerriden<Person>{ 
    @Override 
    public DateTime method (Person parameter){ 
     return new DateTime(); 
    } 
} 

लेकिन आप ऐसा नहीं कर सकते कि generification बिना, और समस्या तर्क, नहीं वापसी प्रकार है। मान लीजिए कि आप जनरेशन के बिना ऐसा कर सकते हैं, तो आप इंटरफ़ेस के साथ अपने कार्यान्वयन ऑब्जेक्ट का संदर्भ रख सकते हैं, और आप विधि को किसी ऑब्जेक्ट के साथ तर्क के रूप में कॉल कर सकते हैं, न सिर्फ एक व्यक्ति (जो जावा की टाइप-सुरक्षा के खिलाफ है)।

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