2011-04-18 16 views
26

संभव डुप्लिकेट:
Why can't C# interfaces contain fields?क्या एक इंटरफेस में एक चर हो सकता है?

हाय सब,

Jon Skeet has answered to a question that Using a property is backed by a variable.

लेकिन इंटरफेस में गुण सी # में अनुमति दी जाती है। क्या इसका मतलब है कि सी # में इंटरफेस में एक चर हो सकता है और संपत्ति द्वारा समर्थित चर को कैसे संभाला जाएगा?

अग्रिम धन्यवाद।

+0

@ गिशू - (+1) सही धागे को इंगित करने के लिए धन्यवाद। ------------------------------------------------ ------ @ संदीप - सरल शब्दों में, एक इंटरफ़ेस में केवल विधि घोषणाएं हो सकती हैं। गुण, घटनाएं या अनुक्रमणिकाकर्ता विधियों के रूप हैं। गुणों में गेटटर और सेटर विधियों के केवल वेरिएंट हैं। अधिक जानकारी के लिए कृपया "सी # के माध्यम से सीएलआर" या "आवश्यक .नेट वॉल्यूम 1" देखें। –

उत्तर

19

नहीं। एक इंटरफ़ेस में फ़ील्ड नहीं हो सकता है।

एक इंटरफ़ेस एक संपत्ति घोषित कर सकता है, लेकिन यह इसका कोई कार्यान्वयन प्रदान नहीं करता है, इसलिए कोई समर्थन क्षेत्र नहीं है। यह तब होता है जब एक वर्ग एक इंटरफ़ेस लागू करता है कि बैकिंग फ़ील्ड (या स्वचालित संपत्ति) की आवश्यकता होती है।

+0

उत्तर देने के लिए धन्यवाद। यद्यपि संपत्ति एक क्षेत्र की सेट विधि प्राप्त करने के लिए सिंटैक्टिक चीनी है, जब इंटरफेस में उपयोग किया जाता है तो केवल फ़ील्ड को छोड़कर सेट विधियां मौजूद होती हैं। कृपया मुझे सही करें अगर मैं इसे गलत समझ गया। – Sandeep

+1

@ संदीप - एक फ़ील्ड को प्राप्त/सेट विधियां नहीं मिली हैं। एक क्षेत्र केवल कक्षा के साथ जुड़े भंडारण का एक आइटम है। एक संपत्ति एक सदस्य होता है जिसे क्लाइंट कोड में फ़ील्ड की तरह एक्सेस किया जाता है, लेकिन कोड को निष्पादित करने के लिए कोड को निष्पादित करने की अनुमति देता है, या मान सेट होने पर कुछ प्रोसेसिंग करने की अनुमति देता है। एक संपत्ति एक या अधिक क्षेत्रों से जुड़ी हो सकती है, लेकिन ऐसा नहीं होना चाहिए। एक स्वचालित संपत्ति ('int Property {get; set;}') एक ऐसी संपत्ति के लिए सिंटैक्टिक चीनी है जो बस एक निजी बैकिंग फ़ील्ड प्राप्त करती है और सेट करती है। –

+1

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

18

एक इंटरफेस एक नाम स्थान या एक वर्ग के एक सदस्य हो सकता है और निम्नलिखित सदस्यों के हस्ताक्षर हो सकते हैं:

Methods 

Properties 

Indexers 

Events 

गुण इंटरफेस पर घोषित किया जा सकता। घोषणा निम्न प्रपत्र लेती है: एक इंटरफ़ेस संपत्ति के एक्सेसर में कोई शरीर नहीं है।

इस प्रकार, एक्सेसर्स का उद्देश्य यह इंगित करना है कि क्या संपत्ति पढ़ना, लिखना, या केवल लिखना है या नहीं।

उदाहरण:

// Interface Properties  
interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

कार्यान्वयन:

public class Employee: IEmployee 
{ 
    public static int numberOfEmployees; 

    private int counter; 

    private string name; 

    // Read-write instance property: 
    public string Name 
    { 
     get 
     { 
     return name; 
     } 
     set 
     { 
     name = value; 
     } 
    } 

    // Read-only instance property: 
    public int Counter 
    {  
     get  
     {  
     return counter; 
     }  
    } 

    // Constructor: 
    public Employee() 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

MainClass:

public class MainClass 
{ 
    public static void Main() 
    {  
     Console.Write("Enter number of employees: "); 

     string s = Console.ReadLine(); 

     Employee.numberOfEmployees = int.Parse(s); 

     Employee e1 = new Employee(); 

     Console.Write("Enter the name of the new employee: "); 

     e1.Name = Console.ReadLine(); 

     Console.WriteLine("The employee information:"); 

     Console.WriteLine("Employee number: {0}", e1.Counter); 

     Console.WriteLine("Employee name: {0}", e1.Name);  
    }  
} 
1

नहीं, यह है कि इसका मतलब यह नहीं। इंटरफ़ेस वास्तव में में संपत्ति नहीं है, या तो।

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

इंटरफेस केवल निम्नलिखित सदस्यों के लिए हस्ताक्षर परिभाषित कर सकते हैं:

  • तरीके
  • गुण
  • Indexers
  • घटनाक्रम
2

गुण एक इंटरफेस (नहीं पर घोषित किया जा सकता परिभाषित)। लेकिन इंटरफेस प्रॉपर्टी के एक्सेसर में कोई शरीर नहीं है।इस प्रकार, एक्सेसर्स का उद्देश्य इंगित करता है कि क्या संपत्ति केवल पढ़ने-लिखने, पढ़ने-पढ़ने या केवल लिखने के लिए है।

यदि आप इस पर MSDN Doc देखें तो आप देखेंगे कि इंटरफ़ेस में संपत्ति को परिभाषित नहीं करता है, इसके बजाय कार्यान्वयन कक्षा द्वारा कार्यान्वयन किया जाता है।

interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

public class Employee : IEmployee 
{ 
    public static int numberOfEmployees; 

    private string name; 
    public string Name // read-write instance property 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    private int counter; 
    public int Counter // read-only instance property 
    { 
     get 
     { 
      return counter; 
     } 
    } 

    public Employee() // constructor 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

तो इंटरफ़ेस IEmployee में संपत्तियों की सिंटेक्स ऑटो कार्यान्वित गुण की तरह दिखता है, लेकिन वे सिर्फ संकेत कर रहे हैं कि प्रॉपर्टी read-write, read-only, या write-only, ज्यादा कुछ नहीं है। यह कार्यान्वयन करने और गुणों को परिभाषित करने के लिए कक्षा को लागू करने का कार्य है।

2

नहीं, इंटरफ़ेस केवल "अनुबंध" है। यह कार्यान्वयन वर्ग पर संपत्ति लागू करने के लिए है; यह एक चर का उपयोग करने के लिए इसका उपयोग या नहीं कर सकता है।

+0

मुझे लगता है कि आप भ्रमित हो रहे हैं क्योंकि "ऑटो-समर्थित" गुणों का वाक्यविन्यास इंटरफ़ेस गुणों का एक ही वाक्यविन्यास है। हालांकि, कक्षा में, कंपाइलर आपके लिए बैकिंग चर डाला जाता है; अर्थात। एक ऑटो बैक वाली संपत्ति सिर्फ सिंटेक्टिक चीनी है। –

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