2011-05-05 7 views
26

परिदृश्य
मैं एक स्थिति है जहाँ एक आधार वर्ग AbstractRequest बुलाया प्रकार id <AbstractRequestDelegate> हेडर फाइल में घोषित की एक प्रतिनिधि संपत्ति है है:अधिक विशिष्ट प्रकार के साथ एक सुपरक्लास संपत्ति को ओवरराइड कैसे करें?

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate; 

सार प्रतिनिधि प्रोटोकॉल में कुछ आवश्यक तरीकों शामिल है, और के रूप में 'अमूर्त' शब्द से संकेत मिलता है, AbstractRequest और AbstractRequestDelegate दोनों उप-वर्ग/विस्तारित होने का इरादा रखते हैं।

इसका एक उदाहरण उपclass ConcreteRequest और विस्तारित प्रोटोकॉल ConcreteRequestDelegates होगा, जो दोनों अमूर्त लोगों को अतिरिक्त विधियां जोड़ते हैं। इरादा यह है कि सार और ठोस वर्ग दोनों विधियां एकल निर्दिष्ट प्रतिनिधि उदाहरण को संदेश भेज सकती हैं।

समय पर एक निश्चित बिंदु पर ConcreteRequest ConcreteRequestDelegate द्वारा परिभाषित प्रतिनिधि पर एक विधि को कॉल करना चाहता है। चूंकि प्रतिनिधि का प्रकार आईडी है, इसलिए संकलक चेतावनी देगा कि यह विधि लागू नहीं की जा सकती है।

ConcreteRequest.m: 38: चेतावनी: - @synthesize, @dynamic का उपयोग करें या एक विधि कार्यान्वयन

प्रदान संपत्ति 'प्रतिनिधि' से परिभाषित करने की विधि '-delegate' की आवश्यकता है समस्या
यह चेतावनी उचित है, क्योंकि संपत्ति id <AbstractRequestDelegate> पर टाइप की गई है। इसे ठीक करने के लिए, मैं संकलक को स्पष्ट करना चाहता हूं कि कंक्रीट उदाहरण को सौंपा गया प्रतिनिधि id <ConcreteRequestDelegate> प्रकार का होना चाहिए। यह मेरे लिए पूरी तरह से उचित लग रहा था, इसलिए मैं ConcreteRequest शीर्षक में एक नया संपत्ति में डाल दिया, सार एक ओवरराइड करने के लिए उम्मीद कर रहा:

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate; 

लेकिन इस जहां संकलक, मेरे साथ सहमत नहीं हैं शायद अच्छे कारण के साथ है। मैंने सोचा होगा कि यह गलत वर्ग के साथ एक सुपर क्लास 'संपत्ति को ओवरराइड करने के लिए चेतावनी देगा, लेकिन इसके बजाय यह मुझे इस नई संपत्ति को फिर से संश्लेषित करने की मांग करता है। मैं वहां जाना नहीं चाहता, क्योंकि तब सुपर क्लास के तरीकों के पास एक ही प्रतिनिधि संपत्ति तक पहुंच नहीं होगी।

प्रश्न एक तरह से
वहाँ है करने के लिए 'फिर से घोषित' जोड़ा प्रकार की जानकारी के साथ ठोस उपवर्ग में संपत्ति? या क्या आप मेरी सोच में त्रुटि को खोज सकते हैं, शायद यह एक आम समस्या है जिसे मैं अब तक नहीं आया हूं?

चीयर्स,
ईपी।

पीएस इस काम में दिखाई देने वाले सभी वर्ग और प्रोटोकॉल नाम कल्पित हैं। वास्तविक वर्ग और प्रोटोकॉल नाम, ओपन सोर्स या पेटेंट के लिए कोई समानता पूरी तरह से संयोग है।

+2

पीएस पर एलओएल : डी ... क्या आप सभी इंटरफ़ेस और कक्षाओं के लिए कोड पोस्ट कर सकते हैं ... आप स्पष्टीकरण बहुत लंबा है –

+0

यह पहले से ही मुझे आधा घंटे खर्च करता है, शायद कोई और कई शब्दों के माध्यम से देख सकता है। यदि सभी विफल हो जाते हैं, तो मैं इन वर्गों को छद्म कोड के लिए समय निवेश करूंगा। – epologee

+0

: डी आप क्यों संश्लेषित कर रहे हैं एक समस्या पैदा करेगा –

उत्तर

11

चेतावनी पहले से ही सही सुराग दे दी है। मैंने ओवरराइडिंग सबक्लास में @ गतिशील का उपयोग किया और सब अच्छा है।

+1

क्या आप इस काम को प्राप्त करने के लिए उपclass में किए गए कार्यों पर विस्तार से बता सकते हैं? भी, क्या आप अभी भी मानते हैं कि यह एक अच्छा पैटर्न है? – shaunlim

+3

जो भी बाद में आता है, उसके लिए यह जवाब क्या कह रहा है कि यदि आप उप-वर्ग में संपत्ति को फिर से शुरू करते हैं तो यह प्रभावी ढंग से काम करता है लेकिन एक चेतावनी है। यदि आप अपने .m फ़ाइल में अपने कार्यान्वयन अनुभाग में जाते हैं और "@dynamic samevariablename" पंक्ति जोड़ते हैं, तो यह प्रभावी रूप से @property घोषणा पर जाने की चेतावनी/समस्या का कारण बनता है। यह उम्मीद नहीं की जा सकती है कि यह ऐसा करेगा क्योंकि समस्या हल होने की स्थिति की तुलना में चेतावनी एक अंतर स्थान पर है, लेकिन यह करता है। यह सिर्फ मेरे लिए भी काम किया। –

2

id<ConcreteRequestDelegate>delegateConcreteRequest.m में बस संश्लेषित करें यह ठीक काम करेगा ... इससे कोई समस्या नहीं आएगी।

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

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