2011-07-07 7 views
28

मैं एक वर्ग और एक इंटरफेस है, और का एक उदाहरण एक त्रुटि नहीं बनाया जा सकता है जब मैं इंटरफेस का दृष्टांत करने की कोशिश, मैं मिलता है:सार वर्ग या इंटरफ़ेस

Cannot create an instance of the abstract class or interface

मेरे कोड के नीचे है:

Cannot create an instance of the abstract class or interface

क्या मैं गलत कर रहा हूँ यहाँ:

namespace MyNamespace 
{ 
    public interface IUser 
    { 
     int Property1 { get; set; } 
     string Property2 { get; set; } 
     string Property3 { get; set; } 
     void GetUser(); 
    } 

    public class User : IUser 
    { 
     public int Property1 { get; set; } 
     public string Property2 { get; set; } 
     public string Property3 { get; set; } 

     public void GetUser() 
     { 
      //some logic here...... 
     } 

    } 
} 

जब मैं IUser user = new IUser(); का दृष्टांत करने की कोशिश मैं कोई त्रुटि मिलती है?

+1

उपयोगकर्ता को तुरंत चालू करने का प्रयास करें, इंटरफ़ेस नहीं। – Jacob

उत्तर

9

IUser इंटरफ़ेस है, आप इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं।

आपको इंटरफ़ेस लागू करने वाले ठोस वर्ग को तुरंत चालू करने की आवश्यकता है।

IUser user = new User(); 

या

User user = new User(); 
+1

मुझे लगता है कि आपका मतलब है कि आप इंटरफ़ेस को तुरंत "नहीं कर सकते"? –

2

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

... 
private class User : IUser 
{ 
    ... 
} 

User u = new User(); 
0

यह वही है जो आप कहते हैं, आप केवल एक अमूर्त वर्ग को तत्काल नहीं कर सकते हैं। आपको पहले इसे लागू करने की आवश्यकता है, फिर उस वर्ग को तुरंत चालू करें।

IUser user = new User(); 
35

त्रुटि संदेश स्वयं स्पष्टीकरणपूर्ण लगता है। आप एक इंटरफ़ेस के उदाहरण को तुरंत चालू नहीं कर सकते हैं, और आपने इंटरफ़ेस के रूप में IUser घोषित कर दिया है। (एक ही नियम अमूर्त वर्गों पर लागू होता है।) एक इंटरफ़ेस का पूरा बिंदु यह है कि कुछ भी — इसके तरीकों के लिए कोई कार्यान्वयन नहीं किया गया है।

हालांकि, अगर आप एक वर्ग है कि औजार कि इंटरफ़ेस है, जो अपने मामले में User वर्ग है (अपने तरीकों के लिए एक कार्यान्वयन प्रदान करता है) का एक उदाहरण का दृष्टांत कर सकते हैं।

इस प्रकार, अपने कोड इस तरह दिखेगा की जरूरत है:

IUser user = new User(); 

यह User वर्ग का एक उदाहरण (जो कार्यान्वयन प्रदान करता है) को दर्शाता है, और इंटरफ़ेस प्रकार के लिए एक वस्तु चर (IUser करने के लिए इसे प्रदान करती है, जो इंटरफ़ेस प्रदान करता है, जिस तरीके से आप प्रोग्रामर के रूप में ऑब्जेक्ट के साथ बातचीत कर सकते हैं)।

बेशक

, आप भी लिख सकते हैं:

User user = new User(); 

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

4

आप इंटरफेस या सार कक्षाओं को तुरंत चालू नहीं कर सकते हैं।

ऐसा इसलिए है क्योंकि इसमें इसका कोई तर्क नहीं होगा।

इंटरफेस तरीकों कि एक वर्ग में होना चाहिए की एक अनुबंध प्रदान करते हैं कार्यान्वयन के बिना। (इसलिए इंटरफ़ेस में कोई वास्तविक तर्क नहीं है)।

सार कक्षाएं कक्षा के मूल तर्क प्रदान करते हैं, लेकिन पूरी तरह कार्यात्मक नहीं हैं (सब कुछ लागू नहीं किया गया है)। तो फिर, आप इसके साथ कुछ भी करने में सक्षम नहीं होंगे।

27

कल्पना करें कि कोई स्टोर में गया है और बिजली स्विच के साथ डिवाइस के लिए कहा है। आपने यह नहीं कहा कि आप एक कॉपियर, टेलीविजन, वैक्यूम क्लीनर, डेस्क दीपक, वफ़ल निर्माता, या कुछ भी चाहते थे। आपने एक बिजली स्विच के साथ एक डिवाइस के लिए कहा। क्या आप क्लर्क को कुछ ऐसी पेशकश करने की उम्मीद करेंगे जिसे केवल "पावर स्विच वाला डिवाइस" के रूप में वर्णित किया जा सके?

एक सामान्य इंटरफ़ेस "पावर स्विच वाला डिवाइस" वर्णन के समान होगा। यह जानकर कि उपकरण का एक टुकड़ा "पावर स्विच वाला एक उपकरण" है, जिससे किसी के साथ कुछ संचालन करने की अनुमति मिलती है (यानी इसे चालू और बंद करें), और कोई शायद स्पष्ट रूप से एक सूची चाहता है। "पावर स्विच वाले डिवाइस जिन्हें दिन के अंत में बंद करना होगा", बिना किसी डिवाइस के पावर स्विच से परे किसी भी विशेषता को साझा करने वाले उपकरणों के बिना, लेकिन ऐसी स्थितियां आमतौर पर केवल उन डिवाइसों पर कुछ सामान्य ऑपरेशन लागू करते समय लागू होती हैं कुछ और विशिष्ट उद्देश्य के लिए। स्क्रैच से कुछ बनाते समय, कुछ यादृच्छिक "डिवाइस स्विच के साथ डिवाइस" की तुलना में, "कॉपर", "टेलीविज़न", "वैक्यूम क्लीनर" या अन्य विशेष प्रकार के डिवाइस की अपेक्षा अधिक होती है।

कुछ परिस्थितियां हैं जहां कोई एक अस्पष्ट परिभाषित वस्तु चाहता है, और वास्तव में इसकी परवाह नहीं है कि यह वास्तव में क्या है। "मुझे अपना सबसे सस्ता उपकरण दें जो पानी उबाल सकता है"। यह अच्छा होगा अगर कोई यह निर्दिष्ट कर सके कि जब कोई "पानी उबलते" क्षमता के साथ मनमाने ढंग से वस्तु मांगता है, तो उन्हें एक Acme 35 9 इलेक्ट्रिक Teakettle की पेशकश की जानी चाहिए, और वास्तव में कक्षाओं का उपयोग करते समय ऐसा करना संभव है। नोट, हालांकि, कोई भी जो "पानी उबालने के लिए उपकरण" मांगता है उसे "पानी उबालने के लिए उपकरण" नहीं दिया जाएगा, बल्कि "Acme 359 इलेक्ट्रिक Teakettle" दिया जाएगा।