2011-09-26 1 views
1

Je substitue une fonction protégée dans une sous-classe.Actionscript Duck-Typing

Disons que j'ai deux classes, Apple et Fruit. J'ai toutes les variables en place, c'est juste une version simplifiée.

class FruitBasket 
    protected function getRandom():Fruit 
    { 
     // return random piece of fruit 
    } 

class AppleBasket extends FruitBasket 
    protected override function getRandom():Apple 
    { 
     // return random apple 
    } 

class Fruit 

class Apple extends Fruit 

L'exemple est trivial. Le problème est que le type de la fonction getRandom dépend de son propre type. L'un retourne une pomme, l'autre rend un fruit. Bien sûr, je reçois des erreurs à propos de l'override et de la coercition.

J'ai essayé de renvoyer un Fruit au lieu d'un Apple, mais alors l'objet n'est pas une pomme, donc il n'a pas de propriétés spécifiques à Apple. Le problème est dans ducktyping. Il y a une troisième classe que je ne peux pas changer, qui exécute la fonction getRandom() sur chaque objet, et j'ai besoin que les pommes soient légèrement différentes.

Comment puis-je remplacer la fonction getRandom dans Apple, afin qu'elle renvoie des pommes, plutôt que des fruits?

Répondre

0

Ceci est un circle-ellipse problem. Je ne remplacerais simplement pas la fonction; Je préférerais renommer la fonction pour être plus spécifique. Renommez-le en getRandomApple() dans AppleBasket. Votre sémantique devient un peu boueuse, donc je rendrais les choses plus séparées et plus claires.

Dommage que vous ne puissiez pas changer le nom de la fonction dans FruitBasket, parce que je changerais cela en getRandomFruit() pour rendre la sémantique plus claire.

+0

Désolé, juste changé le premier message. Supposons que le FruitBasket soit une classe qui ne peut pas être modifiée. Cela fait partie d'une bibliothèque, et plutôt que de la changer, j'en ai fait une sous-classe: AppleBasket. Il fait des pommes, plutôt que des fruits, évidemment. Maintenant, ce FruitBasket est inclus dans une autre classe que je ne peux pas changer, etc etc – flappy

+0

oh je vois ce qui se passe. Cela change ma réponse. – jhocking

+0

Il existe une autre classe que je ne peux pas éditer, disons HiddenClass, qui fonctionne avec Fruit. Puis une autre classe qui utilise le HiddenClass etc J'ai actuellement résolu le problème en créant de nouvelles classes pour chaque classe dans la hiérarchie, de sorte qu'ils peuvent inclure plus de choses spécifiées. Ce n'est pas ma solution préférée, mais cela fonctionne. – flappy

0

L'équivalent du type Duck dans AS3 serait le type "*" ou "Object".