2009-02-12 8 views
28

सी # में, जब मेरे पास एक इंटरफ़ेस और कई ठोस कार्यान्वयन होते हैं, तो क्या मैं इंटरफ़ेस को ठोस प्रकार में डाल सकता हूं या इंटरफ़ेस में कंक्रीट प्रकार कास्ट कर सकता हूं?अपने कंक्रीट कार्यान्वयन ऑब्जेक्ट या इसके विपरीत में इंटरफ़ेस कास्ट करें?

इस मामले में नियम क्या हैं?

+0

सी #, हालांकि मुझे उम्मीद है कि उत्तर सभी ओओ भाषाओं में सही होगा। – dotnetdev

+0

इस तरह की चीज ओओ भाषाओं में समान होने की संभावना है, लेकिन जरूरी नहीं है। सी # पर स्कॉइंग करना ताकि हम आपके लिए एक विशिष्ट उत्तर प्रदान कर सकें। –

उत्तर

33

जावा और सी # दोनों दिशाओं की अनुमति है। डाउनकास्टिंग को एक स्पष्ट कलाकार की आवश्यकता होती है और यदि ऑब्जेक्ट सही प्रकार का नहीं है तो अपवाद फेंक सकता है। उपक्रम, हालांकि, किसी भी स्पष्ट कलाकार की आवश्यकता नहीं है और हमेशा करना सुरक्षित है।

है यही कारण है, यह सोचते हैं आप इस interface, Cat और Dog की public interface Animal और दो कार्यान्वयन ....

Animal meowAnimal = new Cat(); // No cast required 
Animal barkAnimal = new Dog(); // No cast required 

Cat myCat = (Cat) meowAnimal; // Explicit cast needed 
Dog myDog = (Dog) barkAnimal; // Explicit cast needed 

Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception 

है और आप स्पष्ट डाले के चारों ओर एक try/catch चाहता हूँ। सी # में आप उपयोगी as कीवर्ड है:

Dog myDog = barkAnimal as Dog; 
Dog myPet = meowAnimal as Dog; 

कोई अपवाद फेंक दिया जाएगा, और myDog nonNull हो जाएगा और myPet अशक्त हो जाएगा। जावा में समकक्ष कीवर्ड नहीं है हालांकि आप टाइप सुरक्षा को बनाए रखने के लिए हमेशा if (meowAnimal instanceof Dog) परीक्षणों का उपयोग कर सकते हैं। (मुझे लगता है कि होता है कि "as" कीवर्ड बाईटकोड के is विफल रहता है कि अगर करता है, अशक्त बताए उत्पन्न करता है। लेकिन शायद नेट एक बाईटकोड अनुदेश कि "as" के समकक्ष करता है।)

+1

"है" के बारे में क्या: यदि (मेयोएनिमल कुत्ता है) {कुत्ता डी = (कुत्ता) meowAnimal} –

+0

आप कास्टिंग अपवादों से बचने के लिए "है" कीवर्ड का भी उपयोग कर सकते हैं। – Eddie

+8

एक 'जैसा' कास्ट कर रहा है और एक नल चेक एक 'है' चेक और एक स्पष्ट कलाकार के रूप में बेहतर है, क्योंकि आप दो बार कास्टिंग समाप्त करते हैं, एक बार जो सही या गलत होता है और फिर एक बार स्पष्ट कलाकार ((कुत्ता) जानवर)। –

0

दोनों मान्य हैं, यह एक तार्किक कलाकार के रूप में विचार कर रहे हैं। कई बार, आपके इंटरफ़ेस उपभोक्ताओं को कंक्रीट कक्षाओं तक पहुंच नहीं होती है जो पहले स्थान पर इंटरफेस रखने का एक प्रमुख कारण है।

3

आप (लेकिन अन्य भाषाओं के लिए नियम समान हैं) जावा बारे में बात कर रहे हैं, यह इस तरह है:

आप (नीचे) एक ठोस कार्यान्वयन के लिए एक इंटरफेस डाली, संदर्भ आप डाली iff वास्तव में है सकते हैं विशिष्ट ठोस कार्यान्वयन का एक संदर्भ। इसका मतलब है कि

Vehicle v=new Car(); 
(Car)v // this is OK 
(Bus)v // this is not 

त्रुटि जावा में ClassCastException के रूप में प्रकट होता है।

आप इंटरफ़ेस को इंटरफ़ेस के लिए एक इंटरफ़ेस के ठोस कार्यान्वयन को उजागर कर सकते हैं।

+0

मैंने मूल प्रश्न को सी # पर स्कॉप्ड किया है, इसलिए आपका उत्तर अब प्रासंगिक नहीं है। माफ़ कीजिये। –

13

अधिकांश भाषाओं में आप दोनों दिशाओं को डाल सकते हैं। यदि आपके पास ठोस वर्ग है, तो आप इसे इंटरफेस पर डाल सकते हैं। यदि आपके पास इंटरफेस है, तो कंक्रीट क्लास में डालना संभव है।

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

+0

डब्ल्यूपीएफ के बारे में क्या? क्या होगा यदि मुझे किसी सेवा से इंटरफेस वापस मिल जाए और उन्हें WPF UI को बाध्य करने के लिए ViewModels को परिवर्तित करने की आवश्यकता हो? – Darkonekt

0

एक अंतरफलक कर सकते हैं पूरी कक्षा हो, यदि को नहीं होना चाहिए, तो बेहतर होगा जब आप एक ऐसा निर्माता बनाते हैं जो इंटरफेस को पैरामीटर के रूप में स्वीकार करता है और सेटिंग्स की प्रतिलिपि बनाता है, इस तरह आपके पास नियंत्रण होता है कि क्या होता है और क्या आवश्यक है।

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