6
votes

Problèmes d'héritage dans l'objectif c

J'ai créé une classe "SdmutableGrid" afin que je puisse utiliser une grille. C'est juste un enfant de NsmutableArray qui contient un nombre pour les tableaux égaux au nombre de lignes de la grille.

Actuellement, le programme quitte actuellement avant de commencer et qu'il apparaît que c'est parce que les méthodes définies pour NsmutableArray ne s'appliquent pas. à SdmutableGrid, quelqu'un sache pourquoi?

voici le .h: xxx

voici le .m: xxx < / Pré>

Et voici ce qui apparaît sur la console:

2009-08-12 15: 27: 02.076 Flipswitch [1756: 20b] < / Strong> Application de terminaison due à une exception non capturée 'NsinvalidargumentException', raison: ' - [NsmutableArraRay InitiplawithCapacité:]: Méthode définie uniquement pour la classe abstraite. Définir - [SDMutableGrid initwithCapacité:]! ' 2009-08-12 15: 27: 02.080 Flipswitch [1756: 20B] Stack: ( 807902715, 2536648251, 808283725, 808264737, 13690, 11018, 10185, 814713539, 814750709, 814739251, 814722434, 814748641, 839148405, 807687520, 807683624, 814715661, 814752238, 10052, 9906 )


0 commentaires

4 Réponses :


2
votes

OK, j'ai trouvé la réponse de cette question

Bien que les questions soient différentes, la réponse est identique et c'est-à-dire qu'en raison de la configuration de Nsarray (et donc de NsmutableArray), vous ne pouvez pas la sous-classer sans mettre en œuvre les méthodes vous-même.

Donc, je suppose que je vais simplement faire de SDMutableGrid avoir une variable NsmutablARray au lieu d'être réellement un nsmutableRayRay.


1 commentaires

Vérifiez toutes les réponses, c'étaient des réponses rapides.



2
votes

Vous problème est que vous n'ayez pas la mise en œuvre de méthodes abstraites de NsmutableArray Super Class à mettre en œuvre, dit-il - [NsmutableArraRay initwithCapacité:]: Méthode définie uniquement pour la classe abstraite. Définir - [SDMutableGrid initwithCapacité:]! ' 2009-08-12 15: 27: 02.080 Flipswitch [1756: 20B]

Vous avez donc besoin de définir initwithpapacité dans votre sous-classe, je recommanderais de ne pas étendre NsmutableArray, il n'est pas nécessaire de faire une classe qui a une matrice mutable.


0 commentaires

37
votes

La réponse courte et facile: ne faites pas une sous-classe de Nsarray. Il vaut mieux faire une catégorie sur Nsarray ou créer une sous-classe NsObject qui a une ivar Nsarray que vous parlez.

La réponse technique longue: Nsarray est un Cluster de classe . Cela signifie que ce n'est pas réellement une classe, mais de nombreuses classes opérant sous l'interface Nsarray Abstract Class qui sont chacune implémentées de manière différente (par exemple, une implémentation pour de petites tableaux, une autre pour les grandes matrices, etc.). Pour créer une sous-classe d'un cluster de classe, vous devez mettre en œuvre toutes les méthodes primitives de la classe abstraite que vous hériter, gérez votre propre stockage et de répliquer essentiellement tout ce que vous espérez obtenir gratuitement par sous-classement.

Plus simplement, vous pouvez simplement créer une catégorie si vous n'avez pas besoin de ivars supplémentaires. Si vous souhaitez un objet qui se comporte comme un tableau avec un état supplémentaire, vous pouvez créer une classe qui dispose d'un transfert de message Nsarray et utilise un transfert de message Objective-C pour tout transmettre à l'exception de votre comportement personnalisé à cette classe.


1 commentaires

+1 J'ajouterais que le premier exemple d'emballage d'un Nsarray dans une sous-classe de NsObject est appelé une classe composite



7
votes

Ceci est dû à la nature des «clusters de classe» utilisés pour les classes de collecte dans la fondation. Voir: classe Clusters

Fondamentalement, NsmutableArray définit une interface publique à «réseaux mutables», mais n'est pas la classe actuelle que vous utilisez lors de l'initialisation. Donc, «InitiplanwithCapacity:» est défini, mais non implémenté dans NsmutableRayray. Si vous exécutez: P>

NSMutableArary *foo = [[NSMutableArray alloc] init];
NSLog(@"%@", [foo className]);


0 commentaires