2010-07-16 3 views
3

Je crée une sous-classe de UIBarButtonItem, pour fournir certaines fonctionnalités spécifiques.Remplacer la méthode héritée en tant que private dans objectif-c

La nouvelle classe a un initialiseur, qui est le seul qui doit être utilisé lors de la création d'une instance de la classe:

- (id) initWithSomeObject:(SomeObject *)param; 

Le problème est, tous les initialiseurs de UIBarButtonItem sont encore disponibles, donc je pourrait créer une instance de ma nouvelle classe en utilisant quelque chose comme

MyCustomUIBarButtonItem *button = [[MyCustomUIBarButtonItem alloc] initWithBarButtonSystemItem:systemItem target:target action:action]; 

ou autre chose ...

est-il un moyen de cacher les initialiseurs de UIBarButtomItem dans ma sous-classe, de sorte qu'ils ne peuvent pas être utilisés?

Répondre

3

Il suffit de documenter clairement qu'aucun autre initialiseur, mais celui-là doit être utilisé.

Si vous ne faites pas vraiment confiance à vos collègues développeurs ou à vous-même pour lire la documentation, vous pouvez également remplacer les initialiseurs et mettre NSAssert(NO,@"Don't use this"); dans le corps. Vous pouvez lancer une exception au lieu d'utiliser une assertion.

+1

En fonction des détails particuliers ici, il peut également être possible de remplacer les initialiseurs hérités de telle sorte que la chaîne d'initialisation dans la sous-classe mène à la nouvelle DI. –

1

Vous ne pouvez pas rendre privé les autres initialiseurs; rien n'est privé dans Obj-C. Comme le suggère freespace, le mieux que vous pouvez faire ici est de le documenter et, si vous en avez vraiment besoin, de jeter des exceptions par rapport aux autres initialiseurs.

Si cela semble horriblement sujet à l'erreur, c'est parce que c'est. Le modèle de cluster d'initialisation avec un modèle «désigné» (pour lequel il n'y a pas de support syntaxique) est une faille dans le langage ou dans la conception du cadre/modèle Cocoa, selon la façon dont vous le regardez.

Questions connexes