2010-09-20 7 views
10

Je vais apprécier si quelqu'un peut expliquer la logique derrière l'héritage du protocole. par exemple. qu'est-ce que la moyenne suivante (UITableView.h):héritage Understanding Protocole Objective-C

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> 

La mise en œuvre de classe suivante ne fonctionne pas. J'ai une classe View1 (qui hérite de UIView), avec un protocole associé. J'ai une autre classe, View2 (qui hérite View1). Maintenant, je veux hériter du protocole aussi. Est-ce que quelqu'un pourrait me diriger dans la bonne direction.

Classe 1:

@protocol View1Delegate; 

@interface View1 : UIView { 
    id <View1Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View1Delegate> delegate; // default nil. weak reference 

@end 

@protocol View1Delegate <NSObject> 
- (void)View1DelegateMethod; 
@end 

@implementation View1 

@synthesize delegate; 

// . . . 
@end 

Classe 2:

@protocol View2Delegate; 

@interface View2 : View1 { 
    id <View2Delegate> delegate; 
    // . . . 
} 

@property (nonatomic, assign) id <View2Delegate> delegate; // default nil. weak reference 

@end 

@protocol View2Delegate <NSObject> 
- (void)View2DelegateMethod; 
@end 

@implementation View2 

@synthesize delegate; 

// . . . 
@end 

Répondre

11

Pensez plus que la composition plutôt que l'héritage.

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> définit un protocole qui comprend toutes les méthodes du protocole, le protocole NSObjectUIScrollViewDelegate, ainsi que les méthodes définies pour le protocole UITableViewDelegate. Lorsque vous sous-classez et créez une nouvelle propriété, vous remplacez le type de la propriété superclasses. Pour que cela fonctionne comme je le souhaite, vous devez déclarer View2Delegate comme @protocol View2Delegate <NSObject, View1Delegate>.

+1

Merci pour votre réponse. Je déclare le protocole comme vous l'avez mentionné, mais le problème auquel je suis confronté est avec la déclaration de l'ID <...> délégué; Dans View1, j'ai id délégué; avec @property et @synthesize associés. Puisque je hérite de View1 dans View2, quand je déclare id delagete; avec elle est associée @property et @synthesize, je reçois une erreur. « . « délégué » la propriété d'essayer d'utiliser Ivar « délégué » a déclaré en super classe de « View2 » Quelle est la bonne façon de gérer cette situation S'il vous plaît voir les classes d'échantillons i J'ai posté ci-dessus. – Mustafa

0

C'est exactement le même que l'héritage d'interfaces en Java (interface UITableViewDelegate extends NSObject, UIScrollViewDelegate), C# (interface UITableViewDelegate : NSObject, UIScrollViewDelegate), etc.