2015-06-09 6 views
6

ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषाएं उदा। जावा, सी #, ... ऑब्जेक्ट टाइपकास्टिंग का समर्थन करें। उदाहरण के लिए इस जावा में पूरी तरह से वैध है:वस्तु एक अच्छा अभ्यास कास्टिंग है?

URL url = new URL("url");  
URLConnection conn = url.openConnection(); 

if(!conn instanceof HttpURLConnection) 
    throw new Exception("not http request"); 

HttpURLConnection con = (HttpURLConnection) conn; 

या किसी अन्य बुनियादी उदाहरण जो मैंने कोशिश की:

public class Base 
{ 
    public void base(){} 
} 

public class Derived extends Base 
{ 
    public void derived(){} 
} 

Base b = new Derived(); 
b.base(); 

व्युत्पन्न वर्ग सभी तरीकों आधार वर्ग है, के साथ साथ अधिक है। व्युत्पन्न वर्ग कन्स्ट्रक्टर को कॉल करके आप बेस क्लास नहीं बना सकते हैं इसका कोई कारण नहीं है।

मैं इस लिंक http://www.volantec.biz/castingObjects.htm पर भी आया जो बताता है कि ऑब्जेक्ट टाइपकास्टिंग आंतरिक रूप से कैसे काम करता है। अभी तक, ठीक है।

लेकिन पहला उदाहरण HttpURLConnection con = new HttpURLConnection("url address") का उपयोग क्यों नहीं करता है (मुझे पता है HttpURLConnection एक सार वर्ग है)। यह बस अधिक स्पष्ट, अधिक सरल लगता है। दूसरी ओर जब आप interfaces, object typecasting comes in handy से निपट रहे हैं। एक और उदाहरण List<Object> सूची है, जिसे मैं कभी-कभी कुछ कक्षाओं में देखता हूं। इसका मतलब है कि आप इस सूची में हर संभव वर्ग को बचा सकते हैं। इसके बाद आप इसे अपने मूल पर डाल सकते हैं, अगर आपको पता है कि यह किस प्रकार है। I.e. List<String>, List<MyClass> सूची के लिए केवल विशिष्ट वर्गों को सहेजना अधिक स्पष्ट नहीं होगा। List<Object> अच्छी डिजाइन अभ्यास का उपयोग कर रहा है?

+2

'HttpURLConnection' को अनिवार्य कास्टिंग खराब ओओडी का एक आदर्श उदाहरण है। जेनेरिक सूचियों के बारे में: यह निर्भर करता है, लेकिन मैं पैरामीटर-जितना संभव हो सके सूचियों के लिए जाना चाहूंगा, इसलिए मैं संकलन समय पर बहुत से रनटाइम प्रकार कास्ट अपवाद पकड़ सकता हूं। –

+3

खैर, उत्तर प्रश्न में है: HttpUrlConnection एक सार वर्ग है, इसलिए आप HttpUrlConnection का उदाहरण नहीं बना सकते हैं। केवल एक उपclass के। और यही url.openConnection() करता है। –

+0

@ जेबीनिज़ेट मैंने उल्लेख किया कि ब्रैकेट में। मुझे पता है कि HttpURLConnection एक सार वर्ग है, इसलिए आप उल्लेख किए गए उदाहरण नहीं बना सकते हैं। आप सही हैं, मैं बस इसे प्रदर्शित करना चाहता था, शायद कुछ और उदाहरण अधिक उपयुक्त है। – broadband

उत्तर

7

जब एक वर्ग पदानुक्रम को डिजाइन करने के लिए, आप हमेशा ध्यान में Liskov's Substitution Principle (aka, LSP) रखने के लिए:

व्युत्पन्न प्रकार अपने आधार प्रकार के लिए पूरी तरह से substitutable होना चाहिए।

दूसरे शब्दों में, यह तय करने के लिए कि क्या आपको कक्षा का विस्तार करना चाहिए, आपको खुद से पूछना चाहिए कि क्या आपके नए वर्ग पर निर्भर घटकों को अच्छी तरह से सेवा दी जाएगी यदि आप इसे अपनी बेस क्लास में बदल देते हैं।

कास्टिंग के साथ समस्या यह है कि यदि आपको कभी भी बेस क्लास ऑब्जेक्ट को व्युत्पन्न कक्षा में परिवर्तित करने की आवश्यकता है, तो इसका मतलब है कि आप एलएसपी का उल्लंघन कर रहे हैं।

यदि आपको यह सुनिश्चित करने की आवश्यकता है कि एक ऑब्जेक्ट एक विशिष्ट कार्यान्वयन से है जब आप इंटरफ़ेस की अपेक्षा कर रहे हैं, तो निश्चित रूप से आपके डिज़ाइन में कुछ गड़बड़ है।

इंटरफेस अनुबंध की तरह हैं। यदि आप इंटरफ़ेस में नहीं होने वाले कार्यान्वयन की विधि का उपयोग कर रहे हैं, तो इसका मतलब है कि आप उस अनुबंध को तोड़ रहे हैं, जो आपके कोड और कार्यान्वयन के बीच युग्मन बना रहा है।

याद रखें कि आपका कोड हमेशा rely on abstractions rather than concretions होना चाहिए।

0

ऑब्जेक्ट क्लास के साथ कास्टिंग करके मूल रूप से व्युत्पन्न कक्षाओं में हर उपलब्ध अनुमति देकर, यह एक कार्य है जो आगामी पैरामीटर को कभी भी अस्वीकार नहीं करेगा, क्योंकि आपने यह उपलब्ध कराया है कि ऑब्जेक्ट का उपयोग किया जाएगा, इसलिए यह खतरनाक है, और अनुसार @ हेनरिक कह रहा है कि यह सही है कि अगर आपको यह सुनिश्चित करने की ज़रूरत है कि एक ऑब्जेक्ट एक विशिष्ट कार्यान्वयन है जब आप इंटरफ़ेस की अपेक्षा कर रहे हैं, तो निश्चित रूप से आपके डिज़ाइन में कुछ गड़बड़ है।

+1

कृपया अंग्रेजी के छोटे रूप से बचें – lalithkumar

+0

एपी जावा - https://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.html द्वारा डिज़ाइन किया गया था। – broadband

+0

कृपया पूर्ण संदर्भ का जिक्र करें कि 'एपीआई द्वारा जावा द्वारा डिजाइन किया गया था' का मतलब क्या है –

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