Bonjour,
J'ai un petit soucis concernant l'appel de méthodes/propriétés abstraites redéfinies dans une classe fille et utilisées depuis une classe parent.
Voici le contexte (exemple minimaliste de mon problème) :
une classe abstraite acAnimal :
qui définie un membre _name et une propriété abstraite permettant de lire ce membre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 acAnimal is a Class, abstract PROTECTED _name is string END PROCÉDURE PROTECTED Constructor() PROCÉDURE ABSTRACT name() : string
Cette propriété abstraite est donc redéfinie dans les classe filles :
Il suffit, pour créer une instance de chien de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 cDog is a Class inherits acAnimal END PROCÉDURE PRIVATE Constructor(pName is string) _name = pName PROCÉDURE name() : string RESULT _name PROCÉDURE PUBLIC GLOBAL createInstance(pName is string) anObject is acAnimal dynamic <- new cDog(pName) RESULT anObject
et le code suivant ne pose aucun problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 aDog is acAnimal dynamic <- cDog.createInstance("Médor")
Si, maintenant, je passe par un objet qui doit manipuler plusieurs animaux, appelons le cAnimalManager :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 trace(aDog.name) // La trace donne Médor
Voici ce que j'obtiens à l'utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 cAnimalManager is a Class PRIVATE _animals is array of acAnimal dynamic END PROCÉDURE PRIVATE Constructor() PROCÉDURE PUBLIC GLOBAL createInstance() anObject is cAnimalManager dynamic <- new cAnimalManager RESULT anObject PROCÉDURE addAnimal(pAnimal is acAnimal) _animals.Add(pAnimal) PROCÉDURE traceAnimalName() FOR ALL animal OF _animals Trace(animal.name) END
=> au moment de tracer le nom j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 group is cAnimalManager dynamic <- cAnimalManager.createInstance() // Si l'ajout d'un animal passe par une variable intermédiaire comme ici, le trace du nom (méthode abstraite redéfinie dans la classe fille) donne bien le résultat attendu. aDog is acAnimal <- cDog.createInstance("Colosse") group.addAnimal(aDog) // Dans ce cas, l'animal est directement instancié comme paramètre dans l'appel de la méthode addAnimal() group.addAnimal(cDog.createInstance("Médor")) group.traceAnimalName()
Quelqu'un peut-il m'expliquer cette bizarrerie ?
Merci à tous pour vos contributions.
Padbrain
Partager