2011-04-13 15 views
18

ऐसी कई स्थितियां हैं जहां आप एक सुपर क्लास की संपत्ति को ओवरराइड कर सकते हैं।उद्देश्य-सी में संपत्ति ओवरराइड का नुकसान क्या है?

  1. आप समान नाम और उसके सुपर क्लास 'का एक ही विशेषता के साथ एक संपत्ति की घोषणा। (चूंकि यदि आपने बदलने विशेषता आप एक संकलक चेतावनी प्राप्त कर सकते हैं) .और आप एक इवर साथ synthesieze सकते हैं कि तुम बनाते हो। इसका उपयोग क्या है? या क्या नुकसान हो सकता है?

  2. यदि कोई सुपरक्लस कक्षा विस्तार में कोई संपत्ति घोषित करता है (कोई श्रेणी कोई नाम नहीं है), तो हो सकता है कि यह हेडर फ़ाइल में न हो। यदि आप नहीं जानते हैं कि फ़ाइल हेडर से संपत्ति, तो आप वही नाम संपत्ति को कभी भी विशेषता या कक्षा के साथ घोषित कर सकते हैं। लेकिन सेटर/गेटर विधि उस "गुप्त संपत्ति" के लिए ओवरराइड करेगा। मुझे लगता है कि यह केवल नुकसान कर सकता है। लेकिन क्योंकि आप हेडर फ़ाइल से नहीं जानते हैं, तो आप इससे कैसे बच सकते हैं?

  3. आप और के रूप में "केवल पढ़ने के लिए" हेडर फाइल में एक संपत्ति घोषित कर सकते हैं वर्ग विस्तार में "ReadWrite" के रूप में यह redeclare। मुझे लगता है कि यह स्थिति है कि यह अच्छा कर सकता है।

क्या इन स्थितियों के बारे में मेरी समझ सही है? और मुझे नहीं पता कि पहली और दूसरी स्थितियां क्या कर सकती हैं। लेकिन अगर मैं पहली स्थिति से बचना चाहता हूं, तो मैं यह जांच सकता हूं कि सबक्लास के पास पहले से ही संपत्ति है या नहीं। लेकिन अगर संपत्ति सार्वजनिक हेडर फ़ाइल में नहीं है, जैसा कि दूसरी स्थिति में है, तो मुझे नहीं पता कि क्या करना है।

उत्तर

5

वहां स्थितियों आपने उल्लेख किया है में से प्रत्येक के लिए एक उचित स्थान, जंगली में उपयोग की आवृत्ति बाहर अलग-अलग है। आपको सिर्फ अपने आप को कदम उठाने के लिए देखभाल का उपयोग करना होगा। मैं उदाहरण के साथ उदाहरण दूंगा कि मैं व्यक्तिगत रूप से पार हो गया हूं।

उपवर्गीकरण जानबूझकर इस स्थिति में एक संपत्ति
ओवरराइड करने के लिए, जो की तरह उल्लेख किया है, आप बेहतर जानते हैं कि वास्तव में आप क्या कर रहे हैं और कोई अन्य विकल्प हैं इससे पहले कि आप एक संपत्ति को ओवरराइड था। मैंने व्यक्तिगत रूप से पाया है कि संपत्ति को दोबारा घोषित करने और संश्लेषित करने के बजाय, अनुकूलन प्राप्त करने के लिए पहले से मौजूद किसी मौजूदा संपत्ति के लिए एक हीटर या गेटटर को ओवरराइड करने के लिए पर्याप्त रूप से पर्याप्त है। उदाहरण के लिए, एक विशेष UIView उपclass पर विचार करें जो केवल UIClearColor पृष्ठभूमि रखने के लिए समझ में आता है। इसे लागू करने के लिए, आप केवल एक चेतावनी संदेश मुद्रित करने के लिए -setBackgroundColor: ओवरराइड कर सकते हैं और फिर सुपर के कार्यान्वयन को कॉल नहीं कर सकते हैं। मैं कहूंगा कि मेरे पास संपत्ति को पूरी तरह से ओवरराइड करने का कोई कारण नहीं था, लेकिन मैं नहीं कहूंगा कि यह किसी ऐसे मामले में उपयोगी उपकरण नहीं हो सकता है जहां आपको किसी मौजूदा संपत्ति को पूरी तरह से अपहरण करने की आवश्यकता हो।

निजी संपत्ति
यह आपके लिए क्रेडिट देने से अधिक उपयोगी है। एक निजी संपत्ति का विकल्प एक सादा ओल 'इवर है, जिसे हम सभी परिचित हैं।

[_myIvar release], _myIvar = nil; 

या: यह एक इवर कि कुछ अंतराल पर बदल रहा है, तो आप कोड का हिस्सा है कि इस तरह दिखेगा के साथ खत्म हो जाएगा

[_myIvar release]; 
_myIvar = [someValue retain]; 

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

self.myIvar = someValue; 

कौन सा ज्यादा थोड़ी देर के बाद आँखें और उंगलियों पर आसान है। आप यह ध्यान में रखते हुए सही हैं, चूंकि यह संपत्ति शेष ब्रह्मांड के लिए अदृश्य है, इसलिए यह गलती से उप-वर्ग द्वारा ओवरराइड किया जा सकता है। उद्देश्य-सी में विकास करते समय यह एक अंतर्निहित जोखिम है, लेकिन आप खतरे को कम करने के लिए उपाय कर सकते हैं। ये उपाय अनुमानित तरीके से आपकी निजी संपत्तियों के नाम को संशोधित करने में विविधताएं हैं। ऐसी अनंत सड़कों हैं जो आप यहां ले सकते हैं: उदाहरण के लिए, आप इसे अपने निजी संपत्ति के नामों को अपने प्रारंभिक और अंडरस्कोर के साथ प्रीपेड करने के लिए व्यक्तिगत नीति बनाते हैं। मेरे लिए, मुझे mw_ivar, और संबंधित -setMW_ivar: और -mw_ivar एक्सेसर्स जैसे कुछ मिलेगा। हां, यह सांख्यिकीय रूप से संभव है कि कोई भी साथ आ सकता है और गलती से उस नाम को ओवरराइड कर सकता है, लेकिन वास्तव में, वे नहीं करेंगे। विशेष रूप से यदि आपके पास अपने व्यवहार का उपयोग करने का तरीका है जो आपके कोड का उपयोग कर सकते हैं। और, मैं सुरक्षित रूप से कह सकता हूं कि ऐप्पल चारों ओर नहीं गया है और निजी संपत्तियों को बनाया गया है जो इस तरह से उलझ गए थे, इसलिए आप उस मोर्चे पर भी सुरक्षित रहेंगे।

सार्वजनिक रूप से केवल पढ़ने के लिए, निजी तौर पर ReadWrite
यह सिर्फ मानक अभ्यास है। आप सही हैं कि यह उपयोगी है, और यह भी खतरनाक नहीं है क्योंकि संपत्ति हेडर में है। कोई भी गलती से इसे ओवरराइड करने के लिए खुद को दोषी ठहराता है।

+0

इस अन्यथा महान उत्तर में आप जो अन्य उपयोग कर रहे हैं, वह सबक्लास पर एक और विशिष्ट प्रकार निर्दिष्ट करने के लिए है। अर्थात।आपके पास माता-पिता पर 'id' प्रकार की संपत्ति है। उप-वर्ग पर, आप संपत्ति को फिर से चलाने (जैसे 'एनएसएसटींग * ') और फिर उप-वर्ग में' @ गतिशील प्रॉपर्टीनाम 'का उपयोग करके इसे और अधिक विशिष्ट बना सकते हैं ताकि संकलक को माता-पिता में संग्रहण का उपयोग करने के लिए सूचित किया जा सके। –

0

अच्छा प्रश्न

  1. इस का उपयोग करते हैं आप के रूप में डेवलपर पता होना चाहिए कि आप हैं इस बिंदु पर कर रहे हैं और आधार वर्ग संपत्ति को अनुकूलन जोड़ने की जरूरत है। और चूंकि आप जानते हैं कि आप कर रहे हैं तो आप super के कार्यान्वयन को ठीक से कॉल करेंगे जब तक आपके पास कोई अच्छा कारण नहीं है। निर्णय नहीं कॉल सुपर हानिकारक विशेष रूप से में हानिकारक हो सकता है जहां आप नहीं जानते कि आधार कक्षा लागू की गई है।

  2. हाँ यह हानिकारक है लेकिन से अधिक श्रेणियों का उपयोग नहीं है और ध्यान गुण या तरीकों में से एक नाम चुनने और उन्हें लगाकर पर विचार से बचा जा सकता।

  3. हाँ आप सही हैं आपकी संपत्ति तक सीमित पहुंच के लिए अच्छा है।# 2

    के लिए

उदाहरण

@interface UIView(PFXextended) 
-(NSArray*)PFXGetSubviewsOfType:(Class)class; 
@end 
संबंधित मुद्दे