2009-09-08 13 views
5

परिभाषा के अनुसार:सी # - संपत्ति स्पष्टीकरण

"इंटरफेस अपने आप में एक वस्तु नहीं है, मैं है.अगर इंटरफ़ेस प्रारंभ नहीं कर सकते हैं फ़ील्ड घोषित करने के लिए अनुमति दी गई है, तो यह भंडारण स्थान की जरूरत है , इसलिए हम इंटरफ़ेस के अंदर फ़ील्ड घोषित नहीं कर सकते हैं। "

संपत्ति के मामले में उदाहरण कहना

जब मैं

string SayHello { get; set; } 

घोषित इंटरफ़ेस अंदर

यह आंतरिक रूप से आईएल (में get_SayHello() ,set_SayHello() के रूप में झुका है जब मैं एकत्रित न मैं देख सकते हैं प्राप्त करें और सेट विधियां)।

मेरा प्रश्न तो कैसे संपत्ति घोषणा

इंटरफेस के अंदर की अनुमति दी है संपत्ति कुछ भंडारण स्थान की जरूरत अभी भी है।

संपादित करें: यह मैं क्या understood.As मैं सी # करने के लिए नया हूँ, मैं तुम्हारी मदद की तलाश कर रहा हूँ।

उत्तर

13

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

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter, एक कारण देने की देखभाल? – JaredPar

+0

शायद प्रतिस्पर्धी। – Skurmedel

+0

यह अभी स्पष्ट है। धन्यवाद – user160677

6

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

इसके अलावा, यह एक गलतफहमी है कि गुणों के पास बैकिंग फ़ील्ड होना चाहिए। निम्नलिखित नहीं है:

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

गुण केवल ऐसे तरीके हैं जो फ़ील्ड-जैसी वाक्यविन्यास के माध्यम से सुलभ हैं। चूंकि वे विधियां हैं, न कि फ़ील्ड, वे एक इंटरफ़ेस परिभाषित करने योग्य हैं।

2

मेरा प्रश्न अभी भी संपत्ति कुछ भंडारण स्थान

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

1

अच्छी तरह से एक इंटरफ़ेस के अंदर एक घोषणा आपको बताती है कि उस इंटरफ़ेस के उदाहरण पर सदस्यों को क्या होने की उम्मीद की जा सकती है। यह आपको कुछ भी नहीं बताता है कि उन्हें कैसे कार्यान्वित किया जाता है या कहां से बचाया जाता है।

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

4

जैसा कि जेरेड कहते हैं, संपत्ति को किसी भी भंडारण स्थान की आवश्यकता नहीं है ... लेकिन आप अभी भी इसे खत्म कर रहे हैं, मुझे विश्वास है।

कल्पना कीजिए अपने इंटरफेस वास्तव में था:

एक अंतरफलक में
public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

बस तरीकों। क्या आप उससे खुश हैं? यदि ऐसा है, तो वास्तव में यह सभी संपत्तियों को एक साथ जोड़ने के लिए मेटाडेटा के साथ सभी संपत्ति है। खेतों के साथ कुछ भी नहीं ... बस तरीकों।

कार्यान्वयन शायद एक फ़ील्ड का उपयोग करना चाहें, लेकिन यह पूरी तरह इंटरफ़ेस से अलग है।

3

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

निम्न के इंटरफ़ेस में अपनी संपत्ति को बदलना:

string SayHello { get; } 

को लागू करने कक्षाएं केवल उस संपत्ति के लिए गेटर को लागू करने के लिए आवश्यक हैं। लेकिन इंटरफ़ेस स्तर पर कोई संग्रहण आवंटन नहीं हो रहा है।

2

सभी .NET भाषाओं में गुणों की अवधारणा नहीं है। तो इंटरफेस को प्रॉपर्टी के get_ और set_ संस्करणों को भी परिभाषित करना चाहिए ताकि कोई .NET भाषा प्रकार का उपयोग कर सके। यह आपके भ्रम में जोड़ सकता है।

+0

किसी भाषा में किसी संपत्ति की अवधारणा नहीं हो सकती है, यह देखते हुए कि .NET में पढ़ने/लिखने की संपत्ति होने के कारण केवल पढ़ने-योग्य संपत्ति होने से अलग-अलग अर्थ है और एक लेखन- केवल संपत्ति? उदाहरण के लिए, 'आईआरडेबल फू', केवल-पढ़ने वाली संपत्ति 'फू' और 'IWritableFoo' के साथ, एक समान नामित लेखन-केवल संपत्ति के साथ, एक इंटरफ़ेस 'IReadWriteFoo' जो दोनों को विरासत में मिला है, उपयोगी होना चाहिए, तीसरे पढ़ने को परिभाषित करें संपत्ति लिखो। कोई ऐसी भाषा में कैसे करेगा जो गुणों को समझ में नहीं आया? – supercat

+0

@supercat: मुझे नहीं लगता कि यह इस (भयानक) उत्तर से संबंधित है (जिसे मैं जल्द ही हटा दूंगा) या सवाल। "सीएलएस अनुपालन" द्वारा आपके प्रश्न का उत्तर दिया गया है, और कुछ हिस्सों में "क्या आप धूम्रपान कर रहे हैं?"। – Will

+0

यदि कोई भाषा गुणों के बारे में नहीं जानती है, तो क्या कोई तरीका है जिसके द्वारा इसे एक इंटरफ़ेस के कार्यान्वयन को लिखने के लिए उपयोग किया जा सकता है जिसमें एक है? – supercat

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