2010-07-11 10 views
0

Im recherchant un moyen pratique d'ajouter de nouveaux arguments à plusieurs init-methods. C'est un peu difficile à décrire mais mon problème est le suivant:Objective C - classes de sous-classes avec plusieurs init-methods

J'ai une classe qui implémente diverses init-méthodes. f.e.

@interface Circle { 
    CGPoint center; 
    float radius; 
} 
- (id)initWithCenter:...radius:...; 
- (id)initWithRect:...; 
- (id)initWithPoly:...; 

Maintenant, f.e. Je veux créer un crosshair-classe en tant que sous-classe. Donc je veux ajouter peut-être quelques lignes comme variables d'instance. Donc, le problème est que chaque objet réticulaire doit être initialisé avec des valeurs spécifiques, mais bien sûr les méthodes d'initialisation du cercle ne changeraient pas. donc je veux chaque init-method de la superclasse, mais ajoute ces arguments spécifiques à chacun.

la façon directe (dans mes yeux inexpérimentés) est d'écraser chaque méthode dans laquelle puis j'appelle la super-méthode correspondante et ensuite faire mes affaires. Mais c'est très ennuyeux si vous avez 10 méthodes d'initialisation ou plus et que vous voulez juste ajouter les mêmes arguments à chacun. Donc, je demande si theres une meilleure approche pour accomplir cela? soit avec la possibilité de modifier la superclasse ou sans.

merci beaucoup

Répondre

1

En général, vous disposez d'une variante de la méthode init* qui est l'initialiseur désigné . Toutes les autres méthodes init* appellent à celle-là et font ensuite la personnalisation dont elles ont besoin. Les sous-classeurs ajouteraient généralement de nouvelles variantes init* qui appellent [self init*] sur l'initialiseur désigné, car les sous-classeurs ou remplaceraient l'initialiseur désigné (et d'autres, au besoin).

Cependant, cela peut rapidement devenir complètement incontrôlable. Pour votre cercle, il semble vraiment que vous juste voulez:

- (id)initWithCenter:...radius:...; 

Et alors créer une série de méthodes d'usine de commodité pour gérer d'autres types:

+ circleInRect:...; 

(je soupçonne que votre code est un Par exemple, je signalerais aussi la bizarrerie qui est une classe "crosshair" en tant que sous-classe d'une classe "circle" Pour quelque chose comme ça, je commencerais probablement par une classe Shape, puis ajouterai Circle et Crosshair comme une sous-classe de Shape. Evidemment, l'exemple Sketch s hautement pertinent.)