2012-03-19 3 views
7

कक्षा को उप-वर्ग में, मैं मूल वर्ग के एक प्रतिनिधि को भी उपclass करना चाहता हूं क्योंकि उपclass में अब अतिरिक्त कार्यक्षमता है। ऐसा करने के लिए जाने का सबसे अच्छा तरीका क्या है? अगर मैं सिर्फ एक ही नाम के साथ उपवर्ग में एक और प्रतिनिधि संपत्ति घोषित मैं एक चेतावनी मिलेगा "संपत्ति प्रकार 'आईडी' 'आईडी' 'ParentClass'उद्देश्य-सी में एक प्रतिनिधि संपत्ति को सही ढंग से कैसे विभाजित करें?

उत्तर

1

NSTableView और NSOutlineView के उदाहरण का अनुसरण से विरासत में मिली प्रकार से असंगत है।

NSOutlineView NSTableView का एक उपवर्ग है, और उसके dataSource और delegate के लिए अपने स्वयं के प्रोटोकॉल को परिभाषित करता है

NSTableView अपने प्रतिनिधि इस तरह की घोषणा:।

- (void)setDelegate:(id <NSTableViewDelegate>)delegate; 
- (id <NSTableViewDelegate>)delegate; 

और NSOutlineView:

- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject; 
- (id <NSOutlineViewDelegate>)delegate; 

जाहिर संकलक नंगे विधि घोषणाओं के साथ अधिक उदार की तुलना में यह संपत्ति घोषणाओं के साथ है।

एनएसटीबल/आउटलाइन व्यू के विपरीत, आप सब क्लास के प्रोटोकॉल को बेस क्लास प्रोटोकॉल से प्राप्त करना चाहते हैं, उदाहरण के लिए

@protocol SpecializedProtocol <BaseProtocol> 

... यह शायद स्थिति पर निर्भर करता है।

+0

मैं बाद के मार्ग के साथ गया (मुख्य वर्ग को उपclassing के बाद प्रतिनिधि प्रोटोकॉल subclass), लेकिन संकलक त्रुटि ट्रिगर किए बिना एक और प्रतिनिधि संपत्ति घोषित करने में असमर्थ था। क्या संकुल घोषणाएं आपने संकलक को खुश करने का एकमात्र तरीका बताया है? – Boon

+0

मुझे ऐसा करने के किसी अन्य तरीके से नहीं पता है। –

15

इस उदाहरण है कि चेतावनी का उत्पादन को देखते हुए:

// Class A 
@protocol ClassADelegete; 

@interface ClassA : NSObject 
@property (nonatomic, weak) id<ClassADelegete> delegate; 
@end 

@protocol ClassADelegete <NSObject> 
- (void)classADidSomethingInteresting:(ClassA *)classA; 
@end 

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

दो समाधान है कि चेतावनी को निकाल रहे हैं।

1) उपclass में, वर्ग परिभाषा से पहले प्रोटोकॉल परिभाषा रखें।

// Class B 
@class ClassB; 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassBDelegete> delegate; 
@end 

2) उपवर्ग में, नया एक के साथ मूल प्रोटोकॉल जोड़ें:: यह क्या UITableView.h में UITableViewDelegate करता है

// Class B 
@protocol ClassBDelegete; 

@interface ClassB : ClassA 
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate; 
@end 

@protocol ClassBDelegete <ClassADelegete> 
- (void)classBDidSomethingElse:(ClassB *)classB; 
@end 

मुझे लगता है (1) के रूप में एप्पल इस तरह से यह करने के काम करता है, विकल्प (2) चेतावनी को हटा देता है लेकिन मैंने संकलित नहीं किया है और इस तरह से कुछ भी सेटअप चलाया है।

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