2 votes

Comment avoir une variable d'instance qui est un tableau ?

Je voudrais créer une application smalltalk avec une classe qui a une variable d'instance qui est un tableau et une variable d'instance qui est la taille du tableau. Idéalement, je voudrais les initialiser lors de la création de l'objet, mais je les ai initialisées manuellement dans une méthode.

Voici mon code :

Object subclass: Student [
    | numTests marks |

    initialize [
        numTests := 0.
        marks := Array new: 10.
    ]
]
student := Student new.
student initialize.

Mais je reçois l'erreur suivante :

Object: Array new: 10 "<0x10b054b80>" error: method is responsibility of a subclass

Comment puis-je résoudre ce problème ?

6voto

blihp Points 440

Vous ne voulez peut-être pas vraiment le faire. J'utilise généralement les dérivés de Squeak et Array new : fonctionne mais n'est souvent pas ce que vous voulez car les Arrays sont de taille fixe (c'est-à-dire que vous ne pouvez pas ajouter ou supprimer des éléments) et donc vous utilisez typiquement quelque chose comme OrderedCollection à la place. De plus, vous ne voulez généralement pas stocker la taille dans un ivar mais plutôt envoyer #size à votre collection chaque fois que vous avez besoin de savoir combien d'éléments elle contient.

J'ai modifié votre exemple de code en fonction des suggestions ci-dessus (remarquez également que vous n'avez pas besoin d'envoyer #initialize explicitement, cela est fait pour vous via #new :):

Object subclass: Student [
    | marks |

    initialize [
        marks := OrderedCollection new: 10.
    ].

    addMark: newMark [
        marks add: newMark
    ].

    removeMarkAt: markIdx [
        marks removeAt: markIdx
    ].

    size [
        ^ marks size
    ]
]
student := Student new.

Si vous avez vraiment besoin de créer un tableau de taille fixe, veuillez mettre à jour la question en indiquant la variante de Smalltalk que vous utilisez afin que quelqu'un ayant une connaissance spécifique de l'implémentation puisse vous aider. Le problème que vous semblez rencontrer est que votre implémentation Smalltalk considère Array comme une classe abstraite et que vous devez donc instancier une sous-classe de celle-ci pour obtenir un tableau de taille fixe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X