2010-08-22 14 views
0

Je crée une classe qui initialise des instances de certaines classes. Cette classe sera utilisée pour initialiser quelques différents types de classes toutes sous-classées d'une super classe commune. Actuellement j'utilise une variable d'instance:Puis-je spécifier une exigence de superclasse spécifique pour une variable de type de classe?

Class templateClass; 

pour stocker le type de classe. Je reçois des avertissements du compilateur disant que les méthodes ne sont pas supportées par templateClass. Existe-t-il un moyen de supprimer ces avertissements ou de spécifier que la classe template doit être une sous-classe d'une certaine classe?
Aussi, est-ce le moyen idéal pour faire cela à l'objectif-c? Existe-t-il une manière différente de spécifier la classe à utiliser que je devrais utiliser?
Merci pour votre aide!

Editer: La classe que j'écris est conçue pour créer des sprites dans des emplacements choisis au hasard avec quelques variables pour les limiter. Cette classe s'attend à ce que la classe qu'elle utilise soit dotée d'une méthode initWithX:(int)pos yVariance:(int)variance. Je pense que cela peut être défini en utilisant les protocoles que vous avez mentionnés. Je vais créer plusieurs instances de la classe rezzing pour chaque type de sprite que je dois créer. Je veux être en mesure d'envoyer la classe de rezzing initWithTemplateClass:(Class)templateClass pour définir le type de sprite à créer. Je ne suis pas sûr si c'est la bonne façon de procéder, car le compilateur signale que la méthode initWithX:(int)pos yVariance:(int)variance n'est pas disponible pour templateClass. Je m'attends à un problème dans la façon dont j'y vais. Le code qui montre l'avertissement est:

[self addChild:[[templateClass alloc] initWithX:positionOfChild 
    yVariance:(random()%(rowVarianceSize+1))]]; 
+0

Peut-être que vous devriez poster du code qui montre comment vous utilisez 'templateClass' qui génère les avertissements. – imaginaryboy

+0

vient d'ajouter le code – dhatch387

Répondre

1

Edité pour ajouter une 2ème solution

je ne suis pas cet avertissement (ni ne je compte) quand je compile un test simple qui tente de faire ce que vous faites. Cela dit, ce que vous faites semble parfaitement raisonnable. Bien que vous ayez une fuite dans l'exemple 'addChild'. Vous allouez/init votre nouvel objet qui le laisse avec un nombre de retenue de 1, puis (en supposant que 'self' est un UIView) votre appel à addChild conservera également l'objet, mais vous n'avez aucune référence à vous libérer.

id obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
[self addChild:obj]; 
[obj release], obj = nil; 

En outre, la suggestion de définir un protocole de Vladimir est un bon, et si vous le faites, vous pouvez même insérer un contrôle d'exécution que le templateClass vous a été donné est conforme à ce protocole.

if ([templateClass conformsToProtocol:@protocol(Foo)]) { 
    id<Foo> obj = [[templateClass alloc] initWithX:positionOfChild yVariance:(random()%(rowVarianceSize+1))]]; 
    [self addChild:obj]; 
    [obj release], obj = nil; 
} else { 
    // Do whatever you want to do if templateClass isn't correct. 
    // Obviously you could also have the protocol conformance check elsewhere. 
} 

Cependant, comme alternative à tout cela, au lieu d'utiliser votre variable d'instance de classe, vous pouvez définir une interface pour un objet usine qui crée le type particulier de sprite que vous voulez. Passez ensuite une instance de classe de fabrique appropriée.

Par exemple:

@interface Sprite : UIView { 
} 
- (id)initWithX:(int)pos yVariance:(int)variance; 
@end 

@interface SpriteFactory { 
} 
- (Sprite*)createSprite; 
@end 

ensuite créer des paires de sous-classes: une sous-classe Sprite, et une sous-classe SpriteFactory qui crée ce genre de sprite. Ensuite, au lieu d'utiliser votre 'Class templateClass', vous devriez avoir un 'SpriteFactory * factory' à la place.

+0

merci beaucoup! – dhatch387

4

Vous pouvez définir une protocol avec toutes les méthodes nécessaires à l'intérieur. Ensuite, déclarez que vos classes sont conformes à ce protocole.

+0

J'ai besoin de laisser la classe qui s'occupe de l'initialisation savoir quel type initialiser. Existe-t-il une meilleure façon de le faire, puis de le stocker en utilisant le type 'Class'? – dhatch387

+0

Je fais un jeu et une classe s'occupe des sprites rezzing. Je veux l'utiliser pour renvoyer plusieurs types de sprites, mais je ne suis pas sûr que l'utilisation du type Class soit la bonne façon de définir le type d'image-objet qui doit être modifié. Les sprites sont toutes différentes sous-classes d'une superclasse. – dhatch387

+0

Désolé, il semble que ma réponse ne soit pas exactement ce dont vous avez besoin ... Pourriez-vous donner plus d'informations sur comment voulez-vous créer vos sprites, comment vous passez le type de sprites ... – Vladimir