2016-11-29 8 views
8

कोटलिन इंटरफ़ेस में, क्या इससे कोई फर्क पड़ता है कि गुण खाली/सेट स्टेटमेंट के साथ घोषित किए गए हैं?कोटलिन में एक इंटरफ़ेस बनाते समय, क्या इससे कोई फर्क पड़ता है कि गुणों को प्राप्त/सेट किया गया है?

उदाहरण के लिए ...

interface ExampleInterface { 
    // These... 
    val a: String 
     get 
    var b: String 
     get 
     set 

    // ...compared to these... 
    val c: String 
    var d: String 
} 

मैं एक कठिन समय एक अंतर देख आ रही है।

जब इंटरफ़ेस को लागू करने, यह अगर मैं संपत्तियों के लिए getters/setters का उपयोग कोई फर्क नहीं लगता है, या अगर मैं मूल्य सीधे सेट।

जावा के माध्यम से इन्हें एक्सेस करते समय, val दोनों के पास गेटर्स हैं, और var दोनों के पास गेटर्स और सेटर्स हैं।

public void javaMethod(ExampleInterface e) { 
    e.getA(); 

    e.getB(); 
    e.setB(); 

    e.getC(); 

    e.getD(); 
    e.setD(); 
} 
+0

कृपया पर विचार [उत्तर को स्वीकार करना] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) यदि यह पूरी तरह से आपके प्रश्न को कवर करता है या समस्या हल करता है और यदि यह आपकी मदद करता है।यह दूसरों को यह देखने देगा कि आप समाधान या स्पष्टीकरण को स्वीकार करते हैं, और प्रश्न अब अनुत्तरित राज्य में नहीं होगा। – hotkey

उत्तर

10

अपने उदाहरण में संपत्ति घोषणाओं समान हैं, get और set सुरक्षित रूप से, वहाँ से हटाया जा सकता है, क्योंकि के रूप में आप सही ढंग से बताया गया है, accessors वैसे भी उत्पन्न होता है। get और set के साथ वाक्यविन्यास, हालांकि, एक एक्सेसर कार्यान्वयन प्रदान करने या इसकी दृश्यता को प्रतिबंधित करने के लिए उपयोग किया जा सकता है।

  • प्रदान कार्यान्वयन:

    interface ExampleInterface { 
        var b: String 
         get() = "" 
         set(value) { } 
    } 
    

    यह उदाहरण एक संपत्ति एक अंतरफलक में घोषित की डिफ़ॉल्ट कार्यान्वयन को दर्शाता है। इंटरफ़ेस कार्यान्वयन के अंदर यह संपत्ति अभी भी ओवरराइड हो सकती है।

    class Example { 
        var b: String = "" 
         get() = "$field$field" 
    } 
    

    यहाँ, get() = ... एक समर्थन क्षेत्र के साथ एक संपत्ति के डिफ़ॉल्ट गेटर व्यवहार को ओवरराइड करता है, जबकि set उल्लेख नहीं है, इस प्रकार यह सामान्य रूप से व्यवहार करता है।

  • दृश्यता प्रतिबंध:

    class Example { 
        var s: String = "s" 
         private set 
    } 
    

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

    abstract class Example { 
        abstract var b: String 
         protected set // Restrict visibility 
    } 
    

    इस संपत्ति का सेटटर इस वर्ग और इसके उप-वर्गों तक सीमित है। इंटरफेस protected सदस्यों को घोषित नहीं कर सकता है।

बेशक

, एक्सेसर कार्यान्वयन दृश्यता प्रतिबंध के साथ जोड़ा जा सकता है:

class Example { 
    var s: String = "abc" 
     private set(value) { if (value.isNotEmpty()) field = value } 
} 

यह भी देखें:

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