ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषाएं उदा। जावा, सी #, ... ऑब्जेक्ट टाइपकास्टिंग का समर्थन करें। उदाहरण के लिए इस जावा में पूरी तरह से वैध है:वस्तु एक अच्छा अभ्यास कास्टिंग है?
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>
अच्छी डिजाइन अभ्यास का उपयोग कर रहा है?
'HttpURLConnection' को अनिवार्य कास्टिंग खराब ओओडी का एक आदर्श उदाहरण है। जेनेरिक सूचियों के बारे में: यह निर्भर करता है, लेकिन मैं पैरामीटर-जितना संभव हो सके सूचियों के लिए जाना चाहूंगा, इसलिए मैं संकलन समय पर बहुत से रनटाइम प्रकार कास्ट अपवाद पकड़ सकता हूं। –
खैर, उत्तर प्रश्न में है: HttpUrlConnection एक सार वर्ग है, इसलिए आप HttpUrlConnection का उदाहरण नहीं बना सकते हैं। केवल एक उपclass के। और यही url.openConnection() करता है। –
@ जेबीनिज़ेट मैंने उल्लेख किया कि ब्रैकेट में। मुझे पता है कि HttpURLConnection एक सार वर्ग है, इसलिए आप उल्लेख किए गए उदाहरण नहीं बना सकते हैं। आप सही हैं, मैं बस इसे प्रदर्शित करना चाहता था, शायद कुछ और उदाहरण अधिक उपयुक्त है। – broadband