2009-07-26 5 views
3

J'affecte des protocoles dans deux classes qui suivent un arbre d'héritage. Comme si:Les protocoles dans les protocoles peuvent-ils être traités comme incluant le protocole qu'ils adoptent?

première classe

@protocol LevelOne 
- (void) functionA 
@end 

@interface BaseClass : NSObject <LevelOne> { 
} 

deuxième classe

@protocol LevelTwo <LevelOne> 
- (void) functionB 
@end 

@interface SubClass : BaseClass <LevelTwo> { 
} 

Plus tard, je suis assigne la classe en tant que propriétés des délégués des autres classes

classe de base

@interface AppClass : NSObject { 
    @protected 
    id<LevelOne> levelOneDelegate; 
} 

@property (assign) id<LevelOne> levelOneDelegate; 

Sous-classe

@interface AppClassesFriend : AppClass { 
    @protected 
    id<LevelTwo> levelTwoDelegate; 
} 

@property (assign) id<LevelTwo> levelTwoDelegate; 

À la fin de ce parcours, AppClassesFriend possède 2 propriétés. "LevelOneDelegate" a accès à "functionA", lorsqu'il est assigné avec un objet BaseClass

Cependant, je constate que "levelTwoDelegate" n'a accès qu'à "functionB" (il est assigné à un objet SubClass).

Pour que AppClassesFriend puisse utiliser les deux fonctions, il semble que je doive attribuer à la fois un LevelOneDelegate AND levelTwoDelegate.

Est-il possible de faire en sorte que "levelTwoDelegate" ait accès aux deux? Depuis, les deux fonctions sont disponibles sur "SubClass".

Alors, ce que je voudrais être en mesure de faire est:

SubClass *s = [SubClass alloc]; 
AppClassesFriend *a = [AppClassesFriend alloc]; 
a.levelTwoDelegate = s; 

donc à l'intérieur AppClassesFriend (a) je pourrais utiliser:

[self.levelTwoDelegate functionA]; <---- this is never found 
[self.levelTwoDelegate functionB]; 

, mais il semble que je dois ajouter

a.levelOneDelegate = s; 

Merci si quelqu'un a pris le temps de lire tout le chemin jusqu'à ce jour. Donc en résumé la question est, comment puis-je obtenir "levelTwoDelegate" pour avoir accès à la fois à la fonction A et à la fonction B?

Répondre

2

déclare simplement que votre propriété déléguée de la sous-classe met en œuvre tant au niveau un et de niveau deux protocoles (à savoir implémentent à la fois fonctionn et functionB):

@interface AppClassesFriend : AppClass { 
    @protected 
    id<LevelOne,LevelTwo> levelOneAndTwoDelegate; 
} 

@property (assign) id<LevelOne,LevelTwo> levelOneAndTwoDelegate; 
+0

grâce - qui est correct même si mon problème avait une facette supplémentaire, il semble! Étant donné que les superclasses sont codées sur levelOneDelegate utilisé, toutes les méthodes non redéfinies utilisent par défaut ce code. Il n'est pas possible de réaffecter levelOneDelegate dans une sous-classe pour inclure des protocoles supplémentaires, donc la classe de base doit être au courant de TOUS les protocoles (pas du tout, trop bâclée) ou je dois assigner le récepteur aux deux délégués. – Michael

+0

Il n'est pas possible de réattribuer levelOneDelegate, mais vous pouvez créer un type de délégué supplémentaire qui remplace celui d'origine. Par exemple, UITextView fait cela pour que son délégué implémente UITextViewDelegate plutôt que UIScrollViewDelegate. Déclarez simplement functionA dans SuperclassDelegate et functionA et functionB dans SubclassDelegate. – hatfinch

Questions connexes