2010-02-12 17 views
5

संभव डुप्लिकेट:
Why use getters and setters?का उपयोग क्यों करें getters और setters

का उपयोग क्यों करें getters और setters?

+21

क्या यह सिर्फ मुझे है, या कोई और इस विडंबना को देखता है कि सवाल मूल रूप से अपने उत्तर के साथ टैग किया गया था, '[encapsulation] '? –

+2

मैंने इसे मूल प्रश्न पर वापस ले लिया है। नए प्रश्नों को एक नए प्रश्न से पूछा जाना चाहिए, न कि इसे मौजूदा रूप से पूरी तरह से बदलकर। –

+1

आश्चर्यजनक रूप से, डुप्ली का विषय शीर्षक भी वही है। एक अन्य सबूत ओपी ने "संबंधित विषयों" की सूची में खोज या खोज नहीं की थी। – BalusC

उत्तर

2

संपुटित करने के लिए।

1

एक कारण यह एक वस्तु कुछ आप भाषाओं को अब खेतों और तरीकों के बीच वाक्यात्मक अंतर से निपटने के लिए में करने के लिए एक और अधिक समान अंतरफलक प्रदान करना है; आप हमेशा तरीकों से निपटते हैं।

एक दूसरा कारण यह है कि आप वस्तु के कार्यान्वयन छुपाने के लिए, आप अपने ग्राहकों को प्रभावित किए बिना आंतरिक रूप से इसे बदलने के लिए अनुमति देता है। यदि आप ही टिककर खेल का इस्तेमाल किया और setters अपने कार्यक्रम अभी भी भले ही x और y क्षेत्रों चले गए हैं काम करेगा अगर आप एक कार्तीय निर्देशांक के माध्यम से प्रतिनिधित्व किया निर्देशांक है, और ध्रुवीय करने के लिए आंतरिक प्रतिनिधित्व स्विच, - एक क्लासिक उदाहरण निर्देशांक से एक है। यह आपको बहुरूपता का उपयोग करने की अनुमति देता है - दो वस्तुएं एक ही अमूर्तता का प्रतिनिधित्व करती हैं, लेकिन प्रत्येक अपने राज्य के एक अलग कार्यान्वयन के साथ।

विधियों के माध्यम से एक्सेस करना राज्य भी आप तुल्यकालन तरह बातें जोड़ सकते हैं।

4

संपुटित करने के लिए, और कहा कि जिस तरह से आप बनाने कैसे आपने अपनी कक्षा के एक कार्यान्वयन विस्तार भीतर डाटा स्टोर।

private string _mystring = string.Empty; 
public string SomeValue 
{ 
get 
{ 
    return _mystring; 
} 
} 

आप को बदलने का तरीका आप भविष्य में "SomeValue" प्रबंधन की अनुमति देता है कि: आपकी कक्षा एक गेटर/सेटर है। उदाहरण के लिए, आप यह तय कर सकते हैं कि इसे स्ट्रिंग में संग्रहीत करने के बजाय, यह वास्तव में हुड के नीचे एक गइड बनने जा रहा है। अब आप के लिए जा सकते हैं:

private Guid _myguid= Guid.NewGuid(); 
public string SomeValue 
{ 
get 
{ 
    return _myguid.ToString(); 
} 
} 

कहीं भी है कि अपने वर्ग प्रयोग किया जाता है और "SomeValue" संपत्ति इस तरह से अटूट रहेगा पहुँचा जा सकता है।

मान्यता

तुम भी, साथ में पारित मूल्य को मान्य तो एक और उदाहरण में कर सकते हैं:

private string _mystring = "My Value"; 
public string SomeValue 
{ 
get 
{ 
    return _mystring; 
} 
set 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
    throw new InvalidArgumentException(); 
    } 
    else 
    { 
    _myString = value; 
    } 
} 
} 

यह सुनिश्चित करें कि संग्रहीत स्ट्रिंग एक अशक्त/खाली स्ट्रिंग

करने के लिए सेट नहीं किया जाता
11

किसी ऑब्जेक्ट की आंतरिक स्थिति तक पहुंच सीमित करने के लिए।

ज्यामितीय आकार के एक वर्ग के उत्कृष्ट उदाहरण पर विचार करें। कहें, सर्किल ऑब्जेक्ट। आप त्रिज्या सेट करते हैं, आप स्वचालित रूप से क्षेत्र (जो एक केवल पढ़ने के लिए संपत्ति होगा)

class Circle 
{ 
    float radius; 

    public float Radius 
    { 
     get { return radius; } 
     set { radius = value; area = Math.Pi * radius * radius;} 
    } 

    float area; 
    float Area 
    { 
     get { return area;} 
    } 
} 

आप "त्रिज्या" डेटा सदस्य के लिए सीधी पहुँच की अनुमति दी हैं, तो आप area जब अपडेट नहीं कर सका गणना करने के लिए चाहते हो सकता है यह बदल गया। इसके अलावा, अगर आपको area तक सीधे पहुंच की अनुमति है, तो उपयोगकर्ता radius के संबंध में इसे बिना किसी बदलाव के बदल सकते हैं।

+0

यदि 'त्रिज्या' और 'क्षेत्र' के लिए अलग-अलग फ़ील्ड हैं, तो फ़ील्ड मानों के सभी संयोजन मान्य नहीं होंगे। दूसरी तरफ, यदि किसी को 'एरिया' संपत्ति को गणना करने और सर्कल के क्षेत्र को वापस करने के लिए परिभाषित किया गया था, तो 'त्रिज्या' को एक क्षेत्र के साथ प्रतिस्थापित किया जा सकता है और इसे लिखने के लिए 'एरिया' को ठीक से बदलना चाहिए जैसा कि इसे करना चाहिए । जब व्यावहारिक, संरचना के अर्थशास्त्र को परिभाषित करने के लिए व्यावहारिक होता है, तो फ़ील्ड मानों के सभी संभावित संयोजन मान्य होते हैं, जहां संरचनाएं होती हैं, जहां यह मामला नहीं है। – supercat

2

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

  • आप इसे केवल पढ़ने के लिए (कोई सेटटर नहीं) बना सकते हैं।
  • आप सेटटर में इनपुट मान्य कर सकते हैं, और इसे स्वीकार्य नहीं होने पर अस्वीकार कर सकते हैं।
  • जब आप गेटर को पहली बार बुलाया जाता है तो आप ऑब्जेक्ट को तुरंत चालू कर सकते हैं।
  • आप बदल सकते हैं कि यह सब बाद में कैसे काम करता है।

यदि आप क्षेत्र तक पहुंचने के लिए गेटटर और सेटर का सख्ती से उपयोग करते हैं तो आपको कक्षा के भीतर भी यही लाभ मिलते हैं। तो कई लोगों के लिए यह कुछ ऐसा होता है जो वे हर समय करते हैं।

गेटर्स और सेटर्स शुरू में इतने महान नहीं दिखते क्योंकि वे बहुत अधिक टाइपिंग की तरह लगते हैं। लेकिन ग्रहण की तरह आईडीई स्वचालित रूप से आपके लिए गेटर्स और सेटर्स बना सकते हैं, यदि आप चाहें तो। उद्देश्य-सी और रूबी जैसी भाषाएं संक्षिप्त वाक्यविन्यास का उपयोग करके भी ऐसा कर सकती हैं। सी # "गुणों" में गेटर्स और सेटर्स को लपेट सकता है, जो कि खेतों की तरह कोड में उपयोग किए जाते हैं, लेकिन हुड के नीचे यह आपके द्वारा लिखे गए गेटर और सेटर को कॉल करता है।

तो गेटर्स और सेटर्स का उपयोग करने के कई कारण हैं, और इसे कम दर्दनाक बनाने के लिए कई सुविधाएं हैं।

+0

शानदार उत्तर प्लस मुझे नहीं पता था कि ओब्जे-सी से पहले सी # में गुण थे! – cheznead

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