Par exemple, comme beaucoup de développeurs je pense, je dispose d'une classe qui me permet de gérer les rollovers de boutons fait sur la timeline. Il suffit d'utiliser cette classe comme classe de base d'un élément pour qu'un créa puisse faire des boutons fonctionnels sans l'aide d'un codeur. Pour mes exemples, je vous propose une classe "BaseButton":

package com.lalex.display {
        import flash.display.MovieClip;
        import flash.events.MouseEvent;

        /**
         * @author LAlex
         */

        dynamic public class ButtonBase
                extends MovieClip {

                public function ButtonBase() {
                        mouseEnabled = true;
                        buttonMode = true;
                        useHandCursor = true;
                        mouseChildren = false;
                       
                        addEventListener(MouseEvent.CLICK, clickHandler);
                }

                protected function clickHandler(event : MouseEvent) : void {
                        trace("Base button clicked");
                }
        }
}

Un intégrateur peut alors utiliser les fonctionnalités de cette classe en créant un élément de la bibliothèque, dans cet exemple RedButton: RedButton.jpg

Le contenu de RedButton consiste en un clip représentant un rond rouge, sans nom d'instance. RedButtonAsset.jpg

A la compilation, le résultat est celui attendu, à savoir un rond rouge cliquable, qui affiche une main lorsque l'on passe dessus, et trace "Base button clicked" lorsqu'on clique dessus.

Afin de démontrer mes dires, je compile le .fla dans un .swc, que j'ouvre avec FDT pour voir ce que le compilo génère comme classes. Je fais en sorte que les classes générées automatiquement par l'IDE Flash fassent partie du package "com.lalex.flash". Avec les paramètres précédents appliqués à ce bouton tout simple, j'obtiens donc logiquement une classe générée qui a la structure suivante (en passant sur les imports inutiles):

// Generated from  ButtonBase.swc
// Breakpoints are not supported
package com.lalex.flash {
        import com.lalex.display.ButtonBase;

        import flash.display.DisplayObject;
        import flash.events.EventDispatcher;
        import flash.display.Sprite;
        import flash.display.InteractiveObject;
        import flash.display.MovieClip;
        import flash.display.DisplayObjectContainer;

        public dynamic class RedButton extends ButtonBase {
        }
}

Ma classe ButtonBase est évidemment inchangée:

// Generated from  ButtonBase.swc
// Breakpoints are not supported
package com.lalex.display {
        import flash.display.DisplayObject;
        import flash.events.EventDispatcher;
        import flash.display.Sprite;
        import flash.display.InteractiveObject;
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.display.DisplayObjectContainer;

        public dynamic class ButtonBase extends MovieClip {
                protected function clickHandler(arg0 : MouseEvent) : void;
        }
}

Voyons maintenant ce qui se passe lorsque l'on donne un nom d'instance à mon rond rouge: RedButtonAssetBackground.jpg

Lors de la compilation, toujours aucun problème, le résultat est exactement le même. Si on y réfléchit, on pense tout naturellement que cette fameuse option de déclaration automatique des instances a bien évidemment rajouté une propriété "background" dans ma classe com.lalex.flash.RedButton, or lorsque l'on regarde les classes du SWC on y trouve bien autre chose. En effet, ma classe RedButton est inchangée:

// Generated from  ButtonBase.swc
// Breakpoints are not supported
package com.lalex.flash {
        import com.lalex.display.ButtonBase;

        import flash.display.DisplayObject;
        import flash.events.EventDispatcher;
        import flash.display.Sprite;
        import flash.display.InteractiveObject;
        import flash.display.MovieClip;
        import flash.display.DisplayObjectContainer;

        public dynamic class RedButton extends ButtonBase {
        }
}

Et ma classe BaseButton (donc une classe fournie par mes soins à l'IDE) a été modifiée:

// Generated from  ButtonBase.swc
// Breakpoints are not supported
package com.lalex.display {
        import flash.display.DisplayObject;
        import flash.events.EventDispatcher;
        import flash.display.Sprite;
        import flash.display.InteractiveObject;
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.display.DisplayObjectContainer;

        public dynamic class ButtonBase extends MovieClip {
                // [LAlex] This property has been added by Flash!!!
                public var background : MovieClip;

                protected function clickHandler(arg0 : MouseEvent) : void;
        }
}

Comment se fait-il donc que l'IDE se "permette" de modifier une classe qui lui a été donnée?!? Cela risque en effet de modifier son comportement, notamment lorsque cette classe est aussi destinée à être étendue. C'est pourquoi cette propriété "background" aurait clairement du être ajoutée à la classe com.lalex.flash.RedButton...

Par exemple, je veux maintenant créer une classe GreenButton qui va étendre ButtonBase. Cette classe aura une propriété "background" qui peut être un Bitmap. Quid de l'héritage?

package com.lalex.test {
        import flash.geom.ColorTransform;
        import flash.geom.Transform;
        import com.lalex.display.ButtonBase;

        import flash.display.Sprite;

        /**
         * @author LAlex
         */

        public class GreenButton
                extends ButtonBase {
               
                public var background:Bitmap;
               
                public function GreenButton() {
                }
        }
}

Au vu de la manière dont Flash a géré/modifié les classes, on obtient logiquement un conflit entre la déclaration de la propriété "background" dans la version modifiée de ButtonBase, et la déclaration de la propriété "background" dans la classe GreenButton.

/****/com/lalex/test/GreenButton.as, Line 14 | 1152: A conflict exists with inherited definition com.lalex.display:ButtonBase.background in namespace public.

Evidemment, il est toujours possible d'imposer aux créas des process un peu plus stricts sur le nommage de leurs objets sur la scène, l'idéal étant de pouvoir désactiver l'option "Déclarer automatiquement les instances de la scène". Mais dans la pratique, on sait bien que cela n'est pas toujours évident et que l'absence de déclaration automatique, plus propre, ne convient qu'aux codeurs qui travaillent en toute fin du production, sans parallélisation des taches dev/créa, ou sans intervention d'un créa après le développement. Et il faut le dire, ce mode de travail est bien rare sur des projets courts et/ou urgents dont les acteurs se télescopent souvent...

De toutes façons, le problème vient surtout que l'IDE Flash, qui est censé générer des classes via les éléments de la bibliothèque, se permet à ce moment là de modifier des classes qui lui sont fournies au format .as, ce qui est tout à fait anormal. Cela va à l'encontre du principe d'héritage en POO: une base commune et plusieurs sous-classes qui héritent de celle-ci sans la modifier...