[Obj-C] Sous-classe...

NeoJF

Membre actif
1 Novembre 2000
485
6
39
1 chance sur 10 comme toi !
rch.web.free.fr
Bonjour à tous !

Je cherche à sous-classer la classe NSMutableArray pour lui ajouter des fonctions particulières. J'apprends doucement l'Obj-C et Cocoa, mais là je me frotte à un problème insoluble...

Ci-dessous, un exemple de code, pour une sous-classe permettant de manipuler directement des arrays d'entiers :

IntArray.h
Bloc de code:
#import <Cocoa/Cocoa.h>
@interface IntArray : NSMutableArray {
}
+ (id)arrayWithInt:(int)value;
@end

IntArray.m
Bloc de code:
#import "IntArray.h"
@implementation IntArray
+ (id)arrayWithInt:(int)value {
[INDENT]return [super arrayWithObject:[NSNumber numberWithInt:value]];
[/INDENT]
}
@end

et voilà le message que je reçois à l'exécution de [IntArray arrayWithInt:0]; :
2004-11-11 02:57:29.083 GCCocoa[7943] An uncaught exception was raised
2004-11-11 02:57:29.083 GCCocoa[7943] *** initialization method -initWithObjects:count: cannot be sent to an abstract object of class IntArray: Create a concrete instance!
2004-11-11 02:57:29.083 GCCocoa[7943] *** Uncaught exception: <NSInvalidArgumentException> *** initialization method -initWithObjects:count: cannot be sent to an abstract object of class IntArray: Create a concrete instance!

Si vous pouvez m'expliquer ce qui se passe, je serais vraiment ravi !
Merci d'avance !
 
Je crois que le problème vient du fait que c'est un cluster de classe et que il faut pas sous classer ces machins là. NSArray et NSMutableArray sont en fait des "abstract super classes" des classes privées qui composent réellement les arrays. Enfin je crois que c'est pour ça...

Dans le cas que tu présentes la solution la plus élégante (et typiquement Objective-C) à mon avis est d'utiliser une catégorie:

Bloc de code:
@interface NSArray (IntArray)
+ (id)arrayWithInt:(int)value;
@end

et

Bloc de code:
@implementation NSArray (IntArray)
+ (id)arrayWithInt:(int)value {
      return [super arrayWithObject:[NSNumber numberWithInt:value]];
}
@end

si j'ai pas fait d'erreur (bon le compilo te le dira rapidement) et en rajoutant les #import adéquat, j'ai la flemme. ;)

Et tu n'as plus qu'à utiliser NSArray directos (en ayant auparavant #importé ton fichier appelé par exemple: "NSArray-IntArray.h").
 
Super ! Ça marche...
Je pensais bien que les catégories pouvaient être une solution à mon problème, mais comme je ne connaissais pas la façon de les implémenter et que je ne comprenais pourquoi ma sous-classe ne marchait pas, je préférais poser la question...
Donc merci !