2009-06-10 5 views
2

J'ai une petite hiérarchie de classes où j'aimerais que la classe enfant soit une propriété de sa classe parente et de toutes les sous-classes associées. Essentiellement,Comment déclarer une classe enfant en tant que propriété d'une classe parent à utiliser dans des classes enfants apparentées?

  • J'ai AbstractClass avec une propriété de GroupClass.
  • GroupClass est un enfant de AbstractClass.
  • UsableObjectClass est un enfant de AbstractClass et utilise GroupClass.

Si je fais ce qui suit ...

#import <Cocoa/Cocoa.h> 
#import "GroupingClass.h" // I've bounced this between @class as well. 
@interface myAbstractClass : NSObject { 
    GroupingClass* parentGroup; 
} 
@property (readwrite, assign) GroupingClass* parentGroup; 
@end 

#import "myAbstractClass.h" // ERROR LOCATION 
@implementation myAbstractClass 
@synthesize parentGroup; 
@end 

#import <Cocoa/Cocoa.h> 
@interface GroupingClass : myAbstractClass { 
} 
@end 

#import <Cocoa/Cocoa.h> // ERROR LOCATION IN ALL CHILD CLASSES OF AbstractClass 
@interface GroupingClass : myAbstractClass { 
} 
@end 

... Je reçois ce génial "Line Location GroupingClass.h:3: error: cannot find interface declaration for 'myAbstractClass', superclass of 'GroupingClass'" aux emplacements d'erreur notés. J'ai essayé plusieurs façons de faire fonctionner cela (oui, je sais que tout ceci est totalement faux), Catégories et Protocoles semble être la bonne direction, mais cela ne fait que flancher maintenant, et je viens juste besoin d'une poussée dans la bonne direction. Je pense qu'il me manque quelque chose de fondamentalement fondamental (franchement, je suis un peu gêné de poser cette question).

Je suis actuellement en train de porter cette application de REALbasic et quelque chose comme ça était un jeu d'enfant; Je pourrais juste ajouter la propriété en tant que classe d'enfant et cela a juste fonctionné. Objective-C ... pas tellement.

Toute aide, même juste un indice, est grandement appréciée!

Répondre

2

Vous devriez pouvoir utiliser une déclaration @class dans votre en-tête et importer l'en-tête de la sous-classe dans votre fichier d'implémentation.

+0

C'était le peu qui me manquait. Merci! –

0

Vous avez ce qu'on appelle une référence circulaire ou une dépendance. Votre classe de base dépend de sa classe enfant, qui dépend à son tour de la classe de base.

Je vous suggère de reconsidérer votre structure de classe.

+0

Bien, mais il doit encore y avoir un moyen de gérer cela. UsableObjectClass doit au moins savoir quand il a été appliqué à une GroupingClass. Une classe wrapper pour GroupingClass était une idée que je jetais autour. –

+0

La question "pourquoi" vient à l'esprit. * Pourquoi * UsableObjectClass a besoin d'une référence à GroupingClass, et * pourquoi * cette référence est-elle codée dans la classe de base abstraite? Si j'en savais plus sur votre problème, je pourrais vous suggérer une structure différente, mais celle que vous avez semble suivre un anti-modèle. – Randolpho

+0

Essentiellement, GroupingClass est utilisé pour améliorer la sélection d'objets dans une interface personnalisée. La propriété de groupe est testée lorsqu'un objet est sélectionné. Si un objet a été groupé, ce groupe est utilisé comme point de départ pour trouver le groupe parent le plus élevé de façon à ce que tous les objets associés soient sélectionnés. Je suppose que j'aurais dû le mentionner dès le départ. –

2

Ce que vous cherchez est une "déclaration de classe forward". En haut de l'en-tête AbstractClass, ajouter

@class GroupingClass; 

Cela indique au (malheureusement un peu archaïque) compilateur C qu'il y aura une classe appelée GroupingClass et qu'il peut allouer de l'espace pour les variables de ce type de façon appropriée.

Questions connexes