2015-11-03 9 views
5

में किसी अभिभावक की संपत्ति तक पहुंच छिपाना मुझे लगता है कि यह अपेक्षाकृत सरल होना चाहिए लेकिन मुझे इसे पूरा करने का कोई तरीका नहीं मिल रहा है।सबक्लास

Let कहते हैं कि मैं

class Parent { 
    public var file: PFFile? 
} 

और एक उपवर्ग है

class Child : Parent { 
    // some functionality that hides access to super.file 
} 

समस्या मैं कर सकते हैं जनक वर्ग साथ गड़बड़ नहीं है, लेकिन मैं नहीं चाहता कि किसी को भी बाल वर्ग का उपयोग कर चाहते है 'फाइल' तक पहुंच प्राप्त करने के लिए। मैं इसे स्विफ्ट में कैसे पूरा कर सकता हूं?

+0

'सार्वजनिक' संशोधक को हटा रहा है? – NeverHopeless

+0

दुर्भाग्य से मैं पेरेंट क्लास को संशोधित नहीं कर सकता –

उत्तर

0
से

प्रति Swift documentation

आप एक विधि, संपत्ति, या सबस्क्रिप्ट रोका जा सकता है के रूप में अंतिम के रूप में यह चिह्नित करके अधिरोहित जा रहा है। विधि, संपत्ति, या सबस्क्रिप्ट के परिचयकर्ता कीवर्ड (जैसे अंतिम var, अंतिम func, अंतिम श्रेणी func, और अंतिम सबस्क्रिप्ट) से पहले अंतिम संशोधक लिखकर ऐसा करें।

ताकि आप के रूप में

class Parent { 
    final var file: PFFile? 
} 

माता पिता वर्ग घोषणा कर सकते हैं या यदि आप माता पिता वर्ग संशोधित नहीं कर सकते तो शायद इस

class Child : Parent { 
    override private final var file: PFFile? 
} 
+0

क्या आप संग्रहीत संपत्ति को 'ओवरराइड' करने में सक्षम हैं? एचएम ... – user3441734

+0

'कक्षा बाल: अभिभावक' उदाहरण संकलित नहीं होगा क्योंकि ओवरराइड को गणना की गई संपत्ति की आवश्यकता है। – mogelbuster

0

काम करेगा शायद यह एक इसे ठीक:

class Parent { 
    public var file: PFFile? 
} 

class RestrictedParent : Parent { 
    private override var file: PFFile? 
} 

class Child : RestrictedParent { 
    // some functionality that hides access to super.file 
} 

यहां RestrictedParent में, हम कर सकते हैं किसी भी कार्यक्षमता को छिपाएं जो इसे प्राप्त करने वाले किसी भी बच्चे वर्ग को दिखाई नहीं देनी चाहिए।

संपादित:

एक part from doc:

class Car: Vehicle { 
    var gear = 1 
    override var description: String { 
     return super.description + " in gear \(gear)" 
    } 
} 
+0

क्या आपने कभी संग्रहीत संपत्ति को ओवरराइड करने का प्रयास किया था? – user3441734

+0

@ user3441734, कृपया अपडेट पर एक नजर डालें। – NeverHopeless

+0

आप गणना की गई संपत्ति को ओवरराइड करते हैं, संग्रहीत संपत्ति – user3441734

-1

आप final संशोधक का उपयोग कर सकते हैं, इस तरह:

class Perent { 
    final var file: PFFile? 
}  

class Child: Perent { 
    // code here ... 
} 
+0

वह मूल वर्ग को संशोधित नहीं कर सकता है – mogelbuster

0

मुझे नहीं लगता कि यह स्विफ्ट 3 में सीधे संभव है यहां सबसे अच्छा कामकाज है जिसके साथ मैं आ सकता हूं:

class Child : Parent { 
    override public var file: PFFile? { 
     get { return nil } 
     set { } 
    } 
    func exampleFunction() { 
     print(super.PFFile?.description) // Use like this 
     print(PFFile?.description)  // Don't do this 
     //This ^^^ will ALWAYS return nil for PFFile 
    } 
} 

यह एक हैक की तरह है, लेकिन यह लगभग वही है जो आप चाहते हैं। यह बाहरी दुनिया से चर को पूरी तरह छुपा नहींता है, लेकिन यह नपुंसक बनाता है। जब आप file को आजमाते हैं और एक्सेस करते हैं तो आपको हमेशा nil मिलता है, और जब आप इसे फ़ाइल करने के लिए मान निर्दिष्ट करते हैं और असाइन करते हैं तो यह कुछ भी नहीं करता है। तो बाहरी दुनिया अभी भी जानता है कि Child में file की संपत्ति PFFile? है, लेकिन यह इसके बारे में कुछ भी नहीं कर सकती है।

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

फिर, अंदर Child आप MUST उपयोग super.fileहर जगह आप का उपयोग Parent के file संपत्ति। यदि आप file या self.file का उपयोग करते हैं तो आप नपुंसक संस्करण से बातचीत करने की कोशिश करेंगे, और आप कुछ भी नहीं करेंगे और हर बार कुछ भी नहीं प्राप्त करेंगे! मैंने इस उपयोग के उदाहरण के रूप में exampleFunction() शामिल किया है। (मैंने प्रॉपर्टी को PFFile पर बनाया है, बस मान लें कि यह String है)