Есть ли способ создать подкласс и переопределить метод, который находится в пользовательском пространстве имен? - PullRequest
3 голосов
/ 24 марта 2011

Скажем, у меня есть класс с методом, определенным в пространстве имен, отличном от public, protected или internal ...

package com.foo.bar
{
   import com.foo.my_name_space
   public class bar
   {
    private var _vabc:String
    private var _v123:String

    protected function set123(val:String):void{
        _v123 = val;
    }

    my_name_space function setABC(val:String):void{
        _vabc = val;
    }

   }
}

Теперь я хочу расширить и переопределить это в подклассе ...

package com.foo
{
   import com.foo.bar.bar
   import com.foo.my_name_space

   public class foo extends bar
   {
      override protected function set123(val:String):void{
        super.set123(val);
      }

       .... ????? ...

   }
 }

Достаточно просто переопределить защищенные, публичные и т. Д. Методы, но есть ли способ переопределить метод setABC, определенный в пространстве имен * my_name_space *?

Я пробовал следующий синтаксис, который, кажется, проходит проверку предкомпилятора FlashBuilder, но не работает.

    use namespace my_name_space override function my_name_space::setABC(val:String):void

Я пробовал ряд других синтаксических комбинаций, но большинство из них даже не прошли бы проверку перед компиляцией. (многие с некоторой ошибкой в ​​пространстве имен) У меня такое ощущение, что это невозможно, но интересно, есть ли у кого-нибудь идеи?

Ответы [ 2 ]

6 голосов
/ 24 марта 2011

Джеймс ответ правильный. Вы просто не смогли добавить директиву use namespace соответствующим образом. Этот пример работает как ожидалось:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import test.Base;
    import test.Child;
    import test.my_namespace;

    public class Main extends Sprite {

        use namespace my_namespace;

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            var base:Base = new Base();
            base.test();

            var child:Child = new Child();
            child.test();
        }

    }

}

package test {
    import test.my_namespace;
    use namespace my_namespace;

    public class Base {

        my_namespace function test():void {
            trace("Base");
        }

    }

}

package test {
    import test.Base;
    import test.my_namespace;
    use namespace my_namespace;

    public class Child extends Base {

        public function Child() {

        }

        override my_namespace function test():void {
            trace("Child");
            super.my_namespace::test();
        }
    }

}

package test {
    public namespace my_namespece;
}
3 голосов
/ 24 марта 2011

Это должно работать

override my_name_space function setABC(val:String):void
{   
}
...